Entwickler-Ecke

Windows API - Icons von Dateiendungen auslesen


Heiko - Sa 11.02.06 09:40
Titel: Icons von Dateiendungen auslesen
Hi @all,

ich brauche die Icons von den Dateiendung, also die die auch der Explorer für einen Typ stamndardmäßig nimmt, also nicht die speziellen Icons wie bei EXEn. Mein Problem ist, dass ich nur "virtuelle" Dateien habe (liegen auf einem Server ) und damit SHGetFileInfo nicht funktioniert (kann ja nix auf der Festplatte finden ;) ). Wie kann ich also ohne SHGetFileInfo die Icons auslesen?

mfg
Heiko


Lannes - Sa 11.02.06 14:57
Titel: Re: Icons von Dateiendungen auslesen
Hallo,

die Dateien müssen nicht auf der Platte vorhanden sein :wink:
ein kleines Beispiel mit einer ListView:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure InitialisiereIcons;
  var SysIL       : uint;
      SFI         : TSHFileInfo;
      SmallImages : TImageList;
begin
  SmallImages := TImageList.Create(Form1);
  SysIL := SHGetFileInfo(''0, SFI, SizeOf(SFI),
           SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  if SysIL <> 0 then
    begin
    SmallImages.Handle := SysIL;
    SmallImages.ShareImages := TRUE;
    end;
  Form1.ListView1.SmallImages := SmallImages;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitialisiereIcons;
end;

procedure TForm1.Button1Click(Sender: TObject);
var aItem : TListItem;
    Info: TSHFileInfo;
    aFile : String;
begin
  aFile := 'dammy.txt';
  aItem := ListView1.Items.Add;
  aItem.Caption := aFile;
  SHGetFileInfo(PChar(aFile), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo),
            SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES);
  aItem.ImageIndex := Info.IIcon;
end;


Heiko - Fr 17.02.06 16:11

Thx, funktioniert wie ich es brauche :flehan: . (Das ausprobieren hat eine Weile gedauert da ich in der zwischenzeit wo anders eine Baustelle angefangen hatte und erst einmal beenden wieder wollte bevor ich irgendwo noch ein Loch grabe ;) ).


Handycommander - Di 28.02.06 13:56

hab den source auch hergenommen...
nur geht der bei mir nicht ganz...
wobei das img ein ordner ist! und keine datei...

siehe bild...

was mache ich falsch?


Lannes - Di 28.02.06 15:41

Hallo,
user profile iconHandycommander hat folgendes geschrieben:
...wobei das img ein ordner ist! und keine datei...
genau :wink: , das sieht man auch auf Deinem Bild, da steht hinter img in der zweiten Spalte der ListView ja auch Datei. Du übergibst den Ordnernamen als Dateinamen, und deshalb zeigt er Dir das Icon an, das auch im Explorer für Dateien ohne Extension angezeigt wird.

Ein Ordner-Icon und auch Laufwerks-Icons kannst man so ermitteln und einem Listview-Eintrag zuweisen:
:!: in uses ShlObj einbinden :!:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button2Click(Sender: TObject);
var aItem : TListItem;
    Info: TSHFileInfo;
    aOrdner : String;
    aDW : DWORD;
    IShFolder : IShellFolder;
    aItemIdList : PItemIdList;
    wsOrdner : WideString;
begin
  aOrdner := 'c:\temp';
  aItem := ListView1.Items.Add;
  aItem.Caption := aOrdner;
  SHGetDesktopFolder(IShFolder);//Interface holen
  wsOrdner := aOrdner;
  IShFolder.ParseDisplayName(0,nil,PWideChar(wsOrdner),aDW,aItemIdList,aDW);
  SHGetFileInfo(PChar(aItemIdList), 0, Info, SizeOf(TSHFileInfo),
            SHGFI_PIDL or SHGFI_ICON or SHGFI_SMALLICON);
  aItem.ImageIndex := Info.IIcon;
end;


//Edit: Hinweis auf ShlObj in uses hinzugefügt