Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SHGetFileInfo benutzen um verknüpftes Datei-Icon anzuzeigen? (https://www.delphipraxis.net/18976-shgetfileinfo-benutzen-um-verknuepftes-datei-icon-anzuzeigen.html)

Dani 26. Mär 2004 23:36


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:
//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;
Man muss dabei nur beachten, dass man der Funktion GetShellImage auch nen gültigen Dateipfad übergibt! :roll:

Gruß,
Dani

SirThornberry 27. Mär 2004 06:54

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;

mirage228 27. Mär 2004 06:57

Re: SHGetFileInfo nervt/funktioniert nicht so wie es soll...
 
Hi,

ich habe das auf folgende Weise realisiert (funktioniert einwandfrei)

Delphi-Quellcode:
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;
und dann der Code der mir das Icon holt
Delphi-Quellcode:
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;
so etwa siehts dann beim hinzufügen aus
Delphi-Quellcode:
 
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;
Bei mir (Delphi7) klappen alle Codes ohne Probleme, ich bekomme immer das Handle des Icons zurück.

mfG
mirage228

SirThornberry 27. Mär 2004 07:06

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;

Dani 27. Mär 2004 15:44

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:
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;
Folder + FileInfo.Name. Daran lags... an Folder wurde kein "\" angehängt. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz