![]() |
SHGetFileInfo benutzen um verknüpftes Datei-Icon anzuzeigen?
Edit: Problem gelöst!
Hey da, Ich hatte vor, in einer Listview Dateinamen und das dazugehörige Icon darzustellen. Um das Icon zu bekommen, mache ich Folgendes:
Delphi-Quellcode:
Man muss dabei nur beachten, dass man der Funktion GetShellImage auch nen gültigen Dateipfad übergibt! :roll:
//System-Imagelist Handle besorgen
procedure TSearchForm.FormCreate(Sender: TObject); var FI: SHFILEINFO; begin ImageList3.Handle := SHGetFileInfo('', 0, FI, SizeOf(FI) , SHGFI_SYSICONINDEX or SHGFI_SMALLICON ); If ImageList3.Handle <> 0 then ImageList3.ShareImages := True; (* ... *) end; //Icon-Index besorgen function TSearchForm.GetShellImage(Path: PChar): Integer; var FileInfo : TSHFileInfo; FileInfoResult: DWORD; begin Result := -1; FileInfoResult :=SHGetFileInfo(Path, 0, FileInfo, sizeof(FileInfo), SHGFI_ICON OR SHGFI_SMALLICON OR SHGFI_SYSICONINDEX ); If FileInfoResult<>0 then Result := FileInfo.iIcon else begin (* FileInfoResult := GetLastError; ShowMessage(SysErrorMessage(FileInfoResult)); *) end; end; //und schließlich... procedure TSearchForm.AddSearchResult(Folder: String; var FileInfo: TsearchRec); var newItem: TListItem; begin Application.ProcessMessages; newItem := LV.Items.Add; If Folder[Length(Folder)]<>'\' then Folder := Folder + '\'; with newItem do begin Caption := FileInfo.Name; ImageIndex := GetShellImage(Folder+FileInfo.Name); SubItems.Add(Folder); Subitems.Add(FormatFloat('#0,',FileInfo.Size / 1024)+' KB' ); Tag := FileInfo.Size; SubItems.Add(GetFileDesc(Folder+FileInfo.Name)); end; end; Gruß, Dani |
Re: SHGetFileInfo nervt/funktioniert nicht so wie es soll...
du hast ne Zeile vergessen in deinem Create
Delphi-Quellcode:
ImageList3.Handle := SHGetFileInfo('', 0, FI, SizeOf(FI) ,
SHGFI_SYSICONINDEX or SHGFI_SMALLICON ); if ImageList3.Handle <> 0 then ImageList3.ShareImages := True; |
Re: SHGetFileInfo nervt/funktioniert nicht so wie es soll...
Hi,
ich habe das auf folgende Weise realisiert (funktioniert einwandfrei)
Delphi-Quellcode:
und dann der Code der mir das Icon holt
procedure TForm1.FormCreate(Sender: TObject);
var SHFileInfo: TSHFileInfo; SysIcons: THandle; begin GlobalImageList := TImageList.Create(Self); // ist im private feld des forms try SysIcons := SHGetFileInfo(PChar(copy(ParamStr(0), 1, 3)), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON); finally DestroyIcon(SHFileInfo.hIcon); end; GlobalImageList.Handle := SysIcons; end;
Delphi-Quellcode:
so etwa siehts dann beim hinzufügen aus
function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;
var Info: TSHFileInfo; Flags: Cardinal; begin if ASmall then Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES else Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES; SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags); Result := Info.hIcon; end;
Delphi-Quellcode:
Bei mir (Delphi7) klappen alle Codes ohne Probleme, ich bekomme immer das Handle des Icons zurück.procedure TForm1.Datei_Hinzufuegen(const Datei: String); var Icon: TIcon; Item: TListItem; begin lwFileExplorer.Items.Clear; lwFileExplorer.SmallImages := GlobalImageList; Icon := TIcon.Create; try Icon.Handle := GetAssociatedIcon(ExtractFileExt(Datei), True); Icon.Transparent := True; Item := lwFileExplorer.Items.Add; Item.ImageIndex := GlobalImageList.AddIcon(Icon); Item.Caption := ExtractFileName(Datei); finally Icon.Free; end; end; mfG mirage228 |
Re: SHGetFileInfo nervt/funktioniert nicht so wie es soll...
@mirage228: Ist aber ziemlich umständlich. So wie dani es angeht ist es eigentlich schon ok. Habs bei mir so. (ist von der Performance her wohl besser als das von mirage228)
Delphi-Quellcode:
procedure TJBFirstStart01.FormCreate(Sender: TObject); //FormCreate des Formulares
var LHandle: Integer; SFI: TSHFileInfo; begin LHandle := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); if LHandle <> 0 then begin ImageList1.Handle := LHandle; //ImageList1 ist eine TImageList die aufm Form liegt ImageList1.ShareImages := True; end; end; procedure TJBFirstStart01.SetImages; //procedure die ich aufrufe wenn sich der Inhalt von meiner ListView geändert hat var LCount: Integer; Info: TSHFileInfo; begin for LCount := 0 to AddedFolders.Items.Count - 1 do begin SHGetFileInfo(PChar(AddedFolders.Items.Item[Lcount].SubItems.Strings[0]),0,Info,SizeOf(TSHFileInfo),SHGFI_SYSIconIndex or SHGFI_TYPENAME); AddedFolders.Items.Item[LCount].ImageIndex := Info.iIcon; end; end; |
Re: SHGetFileInfo nervt/funktioniert nicht so wie es soll...
Habe was rausgefunden:
Wenn die Datei/der Ordner im Stammverzeichnis der Festplatte liegt, kommt der richtige Iconindex zurück. (z.B. C:\pagefile.sys) Liegt die Datei aber in einem Unterordner, schlägt die Funktion fehl. GetLastError liefert "Das System kann die angegebene Datei nicht finden".
Delphi-Quellcode:
Folder + FileInfo.Name. Daran lags... an Folder wurde kein "\" angehängt. :wall:
procedure TSearchForm.AddSearchResult(Folder: String; var FileInfo: TsearchRec);
var newItem: TListItem; begin newItem := LV.Items.Add; with newItem do begin Caption := FileInfo.Name; ImageIndex := GetShellImage( PChar(Folder+FileInfo.Name) ); SubItems.Add(Folder); Subitems.Add(FormatFloat('#0,',FileInfo.Size / 1024)+' kb' ); Tag := FileInfo.Size; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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