AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SHGetFileInfo benutzen um verknüpftes Datei-Icon anzuzeigen?
Thema durchsuchen
Ansicht
Themen-Optionen

SHGetFileInfo benutzen um verknüpftes Datei-Icon anzuzeigen?

Ein Thema von Dani · begonnen am 26. Mär 2004 · letzter Beitrag vom 27. Mär 2004
Antwort Antwort
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

SHGetFileInfo benutzen um verknüpftes Datei-Icon anzuzeigen?

  Alt 26. Mär 2004, 23:36
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!

Gruß,
Dani
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 27. Mär 2004, 06:54
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 27. Mär 2004, 06:57
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 27. Mär 2004, 07:06
@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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 27. Mär 2004, 15:44
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.
Dani H.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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