![]() |
Symbol eines Dateityps
Ich bin gerade am Überlegen, wie ich das Standard-Icon eines Dateityps erhalten kann, wenn ich den Namen der Datei nicht weiß! Ich habe lediglich den Typ, was ja im Prinzip auch ausreicht. Allerdings scheidet da ja SHGetFileInfo bzw. ExtractAssociatedIcoc aus, da diese ja den ganzen Namen verlangen.
Also fällt mir nur der Weg ein über die Registry, über HKEY_CLASSES_ROOT. Dort ist ja bei dem Dateityp direkt oder indirekt das Icon aufgeführrt, allerdings weiß ich nicht, 1. mit welchen Möglichkeiten das Symbol referenziert werden kann und 2. ob es unter allen Windows-Verrsionen gleich aussieht. Soweit ich das in meiner Registry gesehen hab, ist das Icon der Standard-Eintrag im Unterschlüssel DefaultIcon der Dateierweiterung. Falls es diesen Schlüssel nicht gibt, schau ich nach, ob es einen Schlüssel gibt mit dem Wert des Standardeintrags der jeweiligen Dateiendung. Gibt es diesen, so such ich dort nach dem DefaultIcon-Schlüssel. Existiert er auch dort nicht, weiße ich das Standard-Icon zu. Ist das der einzige Weg oder können die Werte anders gespeichert werden? Und ist das bei allen Versionen gleich? |
Re: Symbol eines Dateityps
hi,
erstelle einfach ein leeres temp file mit der endung dessen icon du suchst, dann kannst du die aktionen daran ausführen. |
Re: Symbol eines Dateityps
Moin Chewie,
such' hier mal nach ![]() Damit kann man, nur mit der Extension, das Icon aus der Systemimagelist laden |
Re: Symbol eines Dateityps
Bei SHGetFileInfo war ich schon, aber ich dachte, da muss der komplette Pfad angegeben werden. Ich habs zwar nicht ausprobiert, aber alles im PSDK deutet darauf hin. OK, ich werds halt mal ausprobieren.
|
Re: Symbol eines Dateityps
Also, ich habe es jetzt ausprobiert.
Wenn ich den ganzen Pfad einer existierenden Datei angebe, wird das Icon ermittelt, ansonsten nicht (SHGetFileInfo gibt 0 zurück). So sieht mein Code aus, mit dem ich ein Icon testweise zeichnen will:
Delphi-Quellcode:
GetIcon sieht so aus:
procedure TForm1.Button2Click(Sender: TObject);
var FileIcon: TFileTypeIcon; Icon: TIcon; begin FileIcon := TFileTypeIcon.Create; Icon := FileIcon.GetIcon('C:\irgendwas.txt'); if Icon = nil then begin ShowMessage('war nix'); Exit; end; Icon.Transparent := True; with PaintBox1 do begin Width := Icon.Width; Height := Icon.Height; Application.ProcessMessages; Canvas.Rectangle(-1, -1, Succ(Width), Succ(Height)); Canvas.Draw(0, 0, Icon); end; Icon.Free; FileIcon.Free; end;
Delphi-Quellcode:
Und RetrieveIcon:
function TFileTypeIcon.GetIcon(const Extension: String): TIcon;
begin {...} Result := RetrieveIcon(Extension); end;
Delphi-Quellcode:
Ich habe es versucht mit ".txt", "*.txt" sowie mit dem Namen einer nicht vorhandenen Datei ("test.txt"). In allen Fällen liefert SHGetFileInfo 0.
function TFileTypeIcon.RetrieveIcon(const Extension: String): TIcon;
var FileInfo: TSHFileInfo; begin Result := nil; if SHGetFileInfo(@Extension[1], 0, FileInfo, Sizeof(FileInfo), SHGFI_ICON or SHGFI_TYPENAME) = 0 then begin Exit; end; Result := TIcon.Create; Result.Handle := FileInfo.hIcon; Und eine eine temporäre Datei erstellen düfte wohl ganz schön auf die Performance drücken. Habe ich da oben also nur einen Fehler gemacht oder funktioniert das grundsätzlich nicht? |
Re: Symbol eines Dateityps
Niemand? :cry:
|
Re: Symbol eines Dateityps
Delphi-Quellcode:
müsstes du nur noch anpassen
function ShlImageIndex(asFileName: String; alSmall,
alOpen: Boolean): Integer; var fInfo : TSHFileInfo; dwFileAttr, dwFlags : Cardinal; begin FillMemory(@fInfo, SizeOf(fInfo), 0); dwFlags := 0; dwFileAttr := 0; if alOpen then dwFlags := dwFlags or SHGFI_OPENICON; // normaler Dateiname oder bloß endung if (Length(asFileName) > 1) and (asFileName[1] = '.') then begin dwFlags := dwFlags or SHGFI_USEFILEATTRIBUTES; dwFileAttr := FILE_ATTRIBUTE_NORMAL; end; SHGetFileInfo(PChar(asFileName), dwFileAttr, fInfo, SizeOf(fInfo), SHGFI_SYSICONINDEX or dwFlags); Result := fInfo.iIcon; end; |
Re: Symbol eines Dateityps
Alles klar. Ich musste das Flag SHGFI_USEFILEATTRIBUTES setzen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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 by Thomas Breitkreuz