Carga roscada de iconos en Delphi
Usando Delphi 2009, intentando hacer un lanzador. Para hacerlo "ágil" realmente me gustaría cargar íconos en un hilo de fondo.
He usado la solución encontrada aquí:¿Se pueden obtener íconos de 48x48 o 64x64 de Vista Shell?
Esto funciona bien, si no se ejecuta en un hilo. Tan pronto como lo coloco en un hilo, algunos íconos no se "captan", o son algún tipo de ícono genérico. Incluso intenté serializar los hilos (haciéndolos obsoletos, en efecto) pero produce los mismos resultados.
Entonces, la pregunta es: ¿Cómo puedo cargar íconos (con las mismas opciones disponibles que el ejemplo vinculado) en un hilo?
/ Lars
Edición: Se agregó una comprobación de errores muy básica en GetIconFromFile
if SHGetFileInfo( PChar( aFile ),
FILE_ATTRIBUTE_NORMAL,
SFI,
SizeOf( TSHFileInfo ),
SHGFI_ICON
or SHGFI_LARGEICON
or SHGFI_SHELLICONSIZE
or SHGFI_SYSICONINDEX
or SHGFI_TYPENAME
or SHGFI_DISPLAYNAME ) <> 0 then
begin
if not Assigned( aIcon ) then
aIcon := TIcon.Create;
aImgList := GetImageListSH( SHIL_FLAG );
aIndex := SFI.iIcon;
if aImgList <> 0 then
aIcon.Handle := ImageList_GetIcon( aImgList, aIndex, ILD_NORMAL );
end;
Esto no hace ninguna diferencia. Todavía estoy recibiendo algunos iconos genéricos (solo cuando esto se llama en un hilo, sin embargo)
Edit2: Threading-code (muy simple):
procedure TIconLoader.Execute;
var
Item : TGridItem;
I : TIcon;
begin
inherited;
while not terminated do
begin
Item := nil;
if assigned(FOnNeedGridItem) then
begin
Synchronize(
procedure
begin
FOnNeedGridItem(Self, Item);
end
);
end;
if assigned(Item) then
begin
GetIconFromFile(Item.FFilename, I, SHIL_EXTRALARGE);
Synchronize(
procedure
begin
Item.SetIcon(I);
end
);
// I.Free;
end
else
Terminate;
end;
end;