Einzelnen Beitrag anzeigen

Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#14

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 1. Feb 2011, 13:50
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
  Mit Zitat antworten Zitat