Ja, Dein Code funktioniert.
Mein - (nur) unter Delphi funktionierender - Code macht folgendes:
-----------------------------------------
Code: Alles auswählen
{$IFDEF FPC}
//CreateImages for Lazarus :
... SmallImagesList.Handle:= hImageList; does not work
.. because Handle is ReadOnly atm
{$ELSE}
//CreateImages for Delphi :
procedure TExplorerTreeView.CreateImages;
(holt sich das Handle auf die gesamte Liste)
(nicht bloß ein einzelnes Icon ..)
var
hImageList : Uint;
SFInfo : TSHFileInfo;
begin
hImageList:= SHGetFileInfo( '', 0, SFInfo, SizeOf( SFInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
if hImagesList <> 0 then
begin
SmallImagesList.Handle:= hImageList;
SmallImagesList.ShareImages := True;
end;
Self.Images:= SmallImagesList;
end; //CreateImages for Delphi
{$ENDIF}
-----------------------------------------
Ich müßte also - weil verschiedene Dinge unter Lazarus
nicht funktionieren - jedes Icon als Bitmap umwandeln
und manuell in meine eigene ImageListe einfügen.
Dann fehlt aber der Zusammenhang Icon <-> FileExtension.
Ich also kann GetIconIndex() mit SHGetFileInfo() nicht verwenden,
das die Position innerhalb der Windows-Imagelist ausliest.
Weil ich ja keinen Zugriff auf die gesamte Icon-Liste habe,
nur Zugriff auf einzelne, unsortierte Icons ..
Ein Workaround wäre möglich .. aber aufwändig :
- jedes gefundene und ausgelesene Icon (über BMP-Umweg) in die eigene Liste einfügen
- eine eigene Indexliste führen, also welcher Icon-Index in Windows
welchem Icon-Index in meiner eigenen Liste entspricht (Mapping)
- jedesmal prüfen ob Icon<->FileExtension vorhanden, wenn nicht, dann von Windows
in die eigene Image-Liste kopieren und die eigene Icon-Indexliste updaten
In der Summe:
Anstatt die Windows-Iconliste verwenden zu können
müßte ich eine Kopie anlegen und selber verwalten.
Das kann ja heiter werden ..
(siehe Bild, soweit isses ... )