![]() |
Problem mit Shellicons...
Ich benutze folgende Funktion um an den ShellIconindex zu kommen:
Delphi-Quellcode:
Das funktioniert bei 99,9% aller Dateien wunderbar, nur z.B. bei *.htm Dateien wird das Defaulticon (unbekannte Datei) anstelle des korrekten Icons (wie im Explorer dargestellt) zurückgeliefert...
function TServer.GetShellIcon(FileName: string): integer;
var SHFileInfo: TSHFileInfo; begin Result := 0; //Falls ein Laufwerksbuchstabe übergeben wurde... if Length(FileName) = 1 then FileName := FileName + ':'; //Laufwerke sollten mit \ enden... if (Length(FileName) = 2) and (copy(FileName, length(FileName), 1) = ':') and (copy(FileName, length(FileName), 1) <> '\') then FileName := FileName + '\'; //Dateiino lesen... ShGetFileInfo(PChar(FileName), 1, SHFileInfo, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON); //IconIndex liefern... Result := SHFileInfo.iIcon end; |
Hallo,
Delphi-Quellcode:
liefert bei mir "4" zurück, Deine Funktion liefert "0", ich kenne zwar den Index der Icons nicht, aber ich denke mal es dürfte stimmen.
SHGetFileInfo(pchar('*.htm'), FILE_ATTRIBUTE_NORMAL, sfi, sizeof(sfi),
SHGFI_ICON OR SHGFI_USEFILEATTRIBUTES); Ersetzte mal den 2. Parameter (Deine 1) durch FILE_ATTRIBUTE_NORMAL und es müßte klappen... GRUND (schlag nach bei ![]() Zitat:
|
Nein, das war's leider nicht...
![]() P.S. Der IconIndex ist dynamisch, d.h. er kann variieren und hängt vom Zeitpunkt des ersten Zugriffes auf das jeweilige Icon ab. Beim Zugriff wird die SystemImageList aktualisiert und das entspr. Icon an der nächsten freien Position eingefügt. |
Moin FriFra,
hast Du mal in der Registry nachgeschaut, wie htm registriert ist? (HKEY_CLASSES_ROOT\.htm, Standardwert, HKEY_CLASSES_ROOT\<der Standardwert von .htm>\DefaultIcon , Standardwert) |
Das hat damit nichts zu tun... ich hab das gleiche Phänomen auf 3 Rechnern mit XP Home, XP pro und Win 2003, unter NT4 funktioniert es...
Im Windows Explorer werden die Dateien auch korrekt angezeigt. Allerdings habe ich schon div. einschlägige Democodes von verschiedenen Seiten geladen... kein Beispiel kann *.htm-icons richtig anzeigen... |
Zitat:
MfG Florian :hi: |
Delphi-Quellcode:
zeigt bei mir das html Icon an, aber nur wenn bei FullPath auch ein vollständiger Dateiname (incl. Pfad) angegeben wurde, *.htm alleine reicht nicht.
var
SHFileInfo: TSHFileInfo; const FullPath = 'D:\Eigene Dateien\Internet\HTML\Startseite\startseite.htm'; begin SHGetFileInfo(FullPath, 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_ICON); Image1.Picture.Icon.Handle := SHFileInfo.hIcon; end; Zitat:
|
Zitat:
Delphi-Quellcode:
und mir danach die SystemImageListe mit
SHGetFileInfo(pchar('*.htm'), FILE_ATTRIBUTE_NORMAL, sfi, sizeof(sfi),
SHGFI_ICON OR SHGFI_USEFILEATTRIBUTES); showmessage(inttostr(sfi.iIcon));
Delphi-Quellcode:
hole ist das Html Icon an 5. Stelle = 4. Index.
PROCEDURE GetSystemImageList(ImageList: TImageList);
VAR res : Integer; shf : TSHFILEINFO; BEGIN res := SHGetFileInfo('', 0, shf, SizeOf(shf), SHGFI_SYSICONINDEX OR SHGFI_SMALLICON); ImageList.handle := Res; ImageList.ShareImages := True; END; -------------------------------- VAR I : Integer; ListItem : TListItem; BEGIN GetSystemImageList(Imagelist1); BEGIN WITH ListView1 DO BEGIN SmallImages := ImageList1; LargeImages := ImageList1; FOR I := 0 TO ImageList1.Count - 1 DO BEGIN ListItem := Items.Add; ListItem.ImageIndex := I; END; END; END; |
Zitat:
Grüsse, Daniel :hi: |
Der Code sieht etwas anders aus (s. Eröffnungspost)...
Ich ermittle lediglich den ImageIndex des Icons. OnCreate habe ich zwei ImageLists das handle der Large-, bzw. SmallIconlist zugewiesen. Beim Aufruf meiner Funktion wird dann nur bei Bedarf ein neues Imagge in die Imagelist eingefügt, bzw. der Index des schon vorhandenen Images geliegfert - eine andere Vorgenensweise (direkter Zugriff auf das Icon) ist nicht performant, bzw. mit keinem heutigem Rechner durchführbar, da die Ressourcen extrem schnell verbraucht wären... P.S.: Ich übergebe immer den kompletten Pfad exisistierender Dateien. Ja, ich meine den Server 2003 (hab ich im Keller stehen :dancer: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz