Eine noch elegantere Methode ist die, das System für die Symbole heranzuziehen. Da unser Beispielprogramm ja sowieso die Dateien des aktuellen Ordners einliest, können wir uns auch ebenso gut die entsprechenden Dateisymbole anzeigen lassen.
Weil wir aber zwei Imagelisten gleichzeitig benutzen wollen (für die kleinen und großen Symbole), ist es sehr wichtig, dass die List-View mit dem Stilattribut LVS_SHAREIMAGELISTS erzeugt wurde. Das hat damit zu tun, dass normalerweise bei der Zuweisung einer Imageliste eine evtl. bereits benutzte wieder freigegeben wird. Sie können also nur mit dem genannten Stilattribut mehr als eine Imageliste verwenden.
Das gilt natürlich auch für den Fall, dass Sie eigene Symbole benutzen wollen. Aber zumindest sind hier die Folgen sofort sichtbar, wenn Sie das Attribut vergessen: Ihre Symbole auf dem Desktop, im Explorer usw. verschwinden möglicherweise und sind erst nach einem Neustart wieder zu sehen.
Wenn Sie also überprüft haben, dass das o.g. Attribut benutzt wurde, dann können Sie die beiden Imagelisten laden. Wir benutzen hierfür die Funktion "SHGetFileInfo", die uns das Handle der jeweiligen Liste als Ergebnis liefert, wenn wir das Flag SHGFI_SYSICONINDEX benutzen.
Für die kleinen Symbole sieht der Aufruf so aus:
hImgSm := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_SMALLICON)); if(hImgSm <> 0) then ListView_SetImageList(hLV,hImgSm,LVSIL_SMALL);
Für die großen Symbole tauschen wir nur das Flag SHGFI_SMALLICON gegen SHGFI_ICON aus:
hImgBig := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_ICON));
Und natürlich müssen wir hier ein anderes List-View-Flag benutzen, weil wir diesmal ja die großen (= normalen) Symbole zuweisen wollen:
if(hImgBig <> 0) then ListView_SetImageList(hLV,hImgBig,LVSIL_NORMAL);
So weit die Grundlagen.
Beim Ermitteln der Symbole erinnern wir uns daran, dass wir uns mit der Funktion "SHGetFileInfo" ja bereits die Typennamen aus dem System geholt haben (s. hier). Da wir die Funktion auch benötigen, um den Index des jeweiligen Symbols zu ermitteln, liegt es doch eigentlich nahe, beide Aufrufe zusammenzufassen und sowohl Dateityp als auch Icon gleich zu ermitteln. Wir fassen also beides zusammen:
ZeroMemory(@fi,sizeof(TSHFileInfo));
SHGetFileInfo(finddata.cFilename,0,fi,sizeof(TSHFileInfo),
SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
Auf diese Weise erhalten wir den Index des Symbols in der iIcon-Membervariablen und können diesen an unseren List-View-Eintrag weitergeben:
lvi.iImage := fi.iIcon;
Mehr muss nicht getan werden, und das Ergebnis ist verblüffend. :o)

Wie bereits angesprochen, dürfen Sie die System-Imagelisten auf keinen Fall freigeben! Wenn Sie sich für diesen Weg hier entscheiden, dann ignorieren Sie, dass Ihnen in diesem Kapitel gesagt wurde wie man eine Imageliste freigibt. Die Folgen sind zwar nur temporärer Natur (ein Neustart, und alles ist wieder beim alten), aber dennoch unangenehm. Bitte denken Sie daran!