Hallo,
ich habe natürlich weiter probiert.
Es scheint tatsächlich am SHGetFileInfo zu liegen?
Mal ein Kurzbeispiel:
{unter M ist das USB-Stick angebaut.}
Delphi-Quellcode:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ShellAPI, gesamt;
type
TForm1 =
class(TForm)
Panel1: TPanel;
Image1: TImage;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
FInfo : TSHFILEINFO;
ic: TIcon;
SIL: HWnd;
il: TImageList;
begin
il:= TImageList.Create(Self);
SIL:=SHGetFileInfo(pchar('
M:\'),0,Finfo,
//name+':\'),0,Finfo,
sizeof(TSHFILEINFO),
SHGFI_SysIconIndex
or SHGFI_Icon
or SHGFI_Smallicon
or SHGFI_displayname
or SHGFI_Typename);
il.handle:=sil;
showmessage('
Iconnumber: '+inttostr(finfo.iicon)+#13+'
Anzahl Iconen in der Liste: '+inttostr(
il.Count));
ic:=TIcon.Create;
ic.Handle:=finfo.hicon;
image1.picture.Icon:=ic;
end;
end.
Wie gesagt: Der USB-Stick hat sein Icon in der Wurzel. Dieses wird daselbst in der Autorun.inf aufgeführt.
Im Windows Explorer klappt alles.
Ist der USB-Stick angeschlossen beim Programmstart, klappt das beim Buttonclick auch.
Wird er nach dem Programmstart (in der
IDE gemacht) angeschlossen, flackert der "Programmrand" zweimal.
Buttonclick nach dem ersten Mal bringt ein falsches Icon.
Wenn erst das zweite Flackern abgewartet wird (etwa 1 sek. später), dann ist es danach zwar die gleiche Iconnumber, aber das richtige Icon.
FileIconInit8true) ändert auch nichts, vergrößert nur die Iconliste auf die echte Systemimagelist.
Also bleibt das Problem, wo der Fehler ist bzw. wie warte ich ab (in Devicechange), bis das zweite "Flackern" erledigt ist.
Ich nenne es "Flackern", weil man das sieht. Aber was macht der da? Evtl. kopiert er da erst die aktualisierte Systemimagelist zu der dem Programm zugeordneten. Dann müsste es aber eine Möglichkeit geben, um zu prüfen, wann er damit fertig ist, oder?
Gruß
Mattze