![]() |
Datei Icons herausfinden
Hi Leute
Ich würd gern eine Virtual String Tree als anzeigeplatz für meine Dateien verwenden. Aber ich möchte des auf der linken seite des symbol vom explorer benutzt wird. Also genauer gesagt möchte ich des symbol auf des die dateierweiterung regestriert ist. Also wenn ich z.b. eine .zip datei anzeigen möchte dann möchte ich des WinZip symbol haben (wenn winzip installiert ist). Aber wenn jetzt z.b. winrar installiert ist dann will ich des rar symbol für die .zip datei haben. So wie es halt im explorer aussieht Daführ gibt es doch sicher ein API oder? so in der richtung: procedure GibMirSystemIcons(DateiErweiterung : PChar) : TIcon; |
Re: Datei Icons herausfinden
Die Icons stehen in der Registry bei den Dateitypen.
|
Re: Datei Icons herausfinden
Wo genau?
Bei z.b. "HKEY_CLASSES_ROOT\.rar" ist der Standart wert auf "WinRAR" sonst nichts |
Re: Datei Icons herausfinden
Und bei RarFile?
|
Re: Datei Icons herausfinden
Ich habe es so ähnlich wie dort gemacht.->
![]() |
Re: Datei Icons herausfinden
![]() |
Re: Datei Icons herausfinden
Ah ok danke des dürfte des sein was ich gesucht habe.
Eine Frage noch: Geht des auch für Ordner? Also wenn ich da einen Ordner angib bekomme ich dann des symbol davon weil ordner können ja auch verschiedene Symbole haben |
Re: Datei Icons herausfinden
Zitat:
...:cat:... |
Re: Datei Icons herausfinden
Zitat:
danke an alle |
Re: Datei Icons herausfinden
Hi ich bins nochmal :mrgreen:
ich benutze jetz folgende funktion:
Delphi-Quellcode:
So diese Funktion funktioniert schon ganz gut. Nur hab ich noch zwei Probleme damit.
function GetFileIcon(const FileName: string; const Icon: TIcon; const FileMustExist: Boolean): Boolean;
var FI: TSHFileInfo; Attributes: DWORD; Flags: Word; begin if FileMustExist then begin Attributes := 0; Flags := SHGFI_ICON or SHGFI_LARGEICON; end else begin Attributes := FILE_ATTRIBUTE_NORMAL; Flags := SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_LARGEICON; end; if SHGetFileInfo(PChar(FileName), Attributes, FI, SizeOf(FI), Flags) <> 0 then begin Icon.ReleaseHandle; Icon.Handle := FI.hIcon; Result := True; end else Result := False; end; Also wenn ich FileMustExist auf true setzte dann bekomme ich bei einer .Ink datei (verknüpfung) überhaupt keinen Icon. Aber wenn ich FileMustExist auf false setzte dann bringt er bei einem Ordner kein richtiges Icon mehr. Habt ihr eine Ahnung warum? |
Re: Datei Icons herausfinden
Ich habe mir dazu mal eine kleine Komponene geschrieben, welche es ermöglicht ganz schnell und unkompliziert auf die Dateisymbole und Beschriftungen der Typen zu zugreifen:
Delphi-Quellcode:
Vielleicht hilft sie ja!
unit ShellIcons;
interface uses SysUtils, Classes, CommCtrl, Controls, Windows, ShellAPI; type TShellIcons = class(TComponent) private FBigIcons: TImageList; FSMallIcons: TImageList; { Private-Deklarationen } protected { Protected-Deklarationen } public property BigIcons: TImageList read FBigIcons; property SmallIcons: TImageList read FSMallIcons; // '' steht für Ordner Dateierweiterungen müssen mit . angegeben werden function GetFileType(const Extension: String): String; function GetImageIndex(const Extension: String; const Opened: Boolean): Integer; procedure RefreshShellIcons; constructor Create(AOwner: TComponent); override; destructor Destroy; override; { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TShellIcons]); end; { TShellIcons } constructor TShellIcons.Create(AOwner: TComponent); begin inherited; FBigIcons := TImageList.Create(Self); FBigIcons.ShareImages := True; FSmallIcons := TImageList.Create(Self); FSMallIcons.ShareImages := True; RefreshShellIcons; end; destructor TShellIcons.Destroy; begin FBigIcons.Free; FSmallIcons.Free; inherited; end; function TShellIcons.GetFileType(const Extension: String): String; var FileInfo: TSHFileInfo; FAttr, Attr: Cardinal; begin ZeroMemory(@FileInfo, SizeOf(FileInfo)); //SHGFI_SMALLICON oder _LARGEICON hat keinen Einfluss auf FileInfo.iIcon >> haben immer den selben Index Attr := SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES; if Extension = '' then FAttr := FILE_ATTRIBUTE_DIRECTORY else FAttr := FILE_ATTRIBUTE_NORMAL; ShGetFileInfo(PChar(Extension), FAttr, FileInfo, SizeOf(TSHFileInfo), Attr); Result := FileInfo.szTypeName; end; function TShellIcons.GetImageIndex(const Extension: String; const Opened: Boolean): Integer; var FileInfo: TSHFileInfo; FAttr, Attr: Cardinal; begin ZeroMemory(@FileInfo, SizeOf(FileInfo)); //SHGFI_SMALLICON oder _LARGEICON hat keinen Einfluss auf FileInfo.iIcon >> haben immer den selben Index Attr := SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_TYPENAME; if Opened then Attr := Attr or SHGFI_OPENICON; if Extension = '' then FAttr := FILE_ATTRIBUTE_DIRECTORY else FAttr := FILE_ATTRIBUTE_NORMAL; ShGetFileInfo(PChar(Extension), FAttr, FileInfo, SizeOf(TSHFileInfo), Attr); Result := FileInfo.iIcon; end; procedure TShellIcons.RefreshShellIcons; var FileInfo: TSHFileInfo; HBigList, HSmallList: HImageList; begin ZeroMemory(@FileInfo, SizeOf(FileInfo)); HSmallList := HImageList(SHGetFileInfo('', FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON)); if HSmallList <> 0 then FSMallIcons.Handle := HSmallList; HBigList := HImageList(SHGetFileInfo('', FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON)); if HBigList <> 0 then FBigIcons.Handle := HBigList; end; end. [Edit] Warum bleibt mein Code beim posten nicht eingerückt??? Wenn ich eh schon den Beitrag nochmal editiere dann gleich nochmal eine kurze Anleitung: - zur Benutzung die Komponente installieren und auf die Form ziehen oder eben zur Laufzeit erzeugen - zur Laufzeit die Eigenschaft für die Bilder der Komponente auf ShellIcons.BigIcons oder .SmallIcons setzen - mit GetImageIndex und GetFileType bekommt man den Index des Bildes/die Dateitypenbeschriftung PS: Wenn mir jemand sagen kann, was ich machen muss, damit die Imagelisten auch im Objektinspektor erscheinen? Wenn ich sie als published deklariere erscheinen sie trotzdem nicht. Liegt das am ReadOnly? |
Re: Datei Icons herausfinden
Hi
Danke Aber des bringt eher wenig da du des gleich machst wie ich ... Habs daweil einmal so gelöst:
Delphi-Quellcode:
if DirectoryExists(Filename) then
begin //Ordner GetFileIcon(Filename, DateiIcon, true); end else begin //Datei GetFileIcon(Filename, DateiIcon, false); end; |
Re: Datei Icons herausfinden
"Aber des bringt eher wenig da du des gleich machst wie ich ... "
Geht das an mich? Ich hab mir die Komponente geschrieben, weil ich sie in vielen Projekten verwende und nicht immer den gleichen Code schreiben wollte. Und sie hat alles damit ich nur noch die Eigenschaften des ListView (z.B.) auf die Imagelisten meiner Kompo setzen muss. Und wenns für dich schon zu spät war hilft sie vielleicht jemandem der nach dem selben Problem hier sucht ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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