Na ja, evtl. sehe ich das mehr aus dem Blickwinkel des etwas fortgeschritteneren Anwenders. Ich persönlich finde es nicht allzu schwer.
1. Also, du pappst 2 Imagelisten auf deine Form, lässt sie aber komplett leer. Eine nennst du "ilSmall", die andere "ilBig". Und
enorm wichtig!: Stell bei beiden im Objektinspektor die Eigenschaft "ShareImages" auf TRUE.
2. Im "OnCreate"-Ereignis deiner Form machst du folgendes:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
hImgSm,
hImgBig : HIMAGELIST;
fi : TSHFileInfo;
begin
// Imageliste mit kleinen Symbolen ermitteln
hImgSm := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON));
// und an die Imageliste auf der Form übergeben
if(hImgSm <> 0) then
ilSmall.Handle := hImgSm;
// Imageliste mit großen Symbolen ermitteln
hImgBig := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
SHGFI_SYSICONINDEX or SHGFI_ICON));
// und an die Imageliste auf der Form übergeben
if(hImgBig <> 0) then
ilBig.Handle := hImgBig;
end;
3. Jetzt kannst du die Dateien auslesen und mit ihrem Symbol anzeigen lassen. Ich habe das auf die Schnelle via Button-Klick und nicht rekursiv machen lassen. Aber es geht ja auch nur um´s Prinzip:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
ds : TSearchRec;
res : integer;
li : TListItem;
fi : TSHFileInfo;
begin
res := FindFirst('c:\*.*',faAnyFile,ds);
while(res = 0) do
begin
if(ds.Attr and faDirectory = 0) and
(ds.Name <> '.') and
(ds.Name <> '..') then
begin
// Name der Datei eintragen
li := Listview1.Items.Add;
li.Caption := ds.Name;
// jetzt Zugriff auf die System-Imageliste
// und nur den Typennamen und das Symbol
// ermitteln!
ZeroMemory(@fi,sizeof(fi));
SHGetFileInfo(pchar('c:\' + ds.Name),0,fi,sizeof(fi),
SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
// Icon-Index zuweisen, ...
li.ImageIndex := fi.iIcon;
// "iIcon" ist eine Integer-Variable und erhält somit
// wirklich nur den Index auf das Symbol, aber nicht
// das Symbol als solches. Daher ist es nun egal, wie
// oft ein Dateityp im Ordner vorkommt.
// ... & Typennamen als Untereintrag hinzufügen
li.SubItems.Add(fi.szTypeName);
end;
res := FindNext(ds);
end;
FindClose(ds);
end;
Fertig.
PS: Wird zwar auch in den Tutorials erwähnt, aber der Vollständigkeit halber:
Gib die Imagelisten auf der Form bitte NICHT frei!. Sonst sind evtl. deine Symbole im Explorer weg.
Ein Neustart behebt das Problem. Allerdings dürfen die Imagelisten in dem Fall eben nicht freigegeben werden. Sie werden ja auch nicht in deinem Programm erzeugt sondern vom System zur Verfügung gestellt.