Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Symbol eines Dateityps (https://www.delphipraxis.net/7322-symbol-eines-dateityps.html)

Chewie 9. Aug 2003 12:57


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?

chris 9. Aug 2003 13:45

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.

Christian Seehase 9. Aug 2003 13:57

Re: Symbol eines Dateityps
 
Moin Chewie,

such' hier mal nach Hier im Forum suchenSHGetFileInfo
Damit kann man, nur mit der Extension, das Icon aus der Systemimagelist laden

Chewie 9. Aug 2003 14:10

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.

Chewie 10. Aug 2003 13:22

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:
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;
GetIcon sieht so aus:
Delphi-Quellcode:
function TFileTypeIcon.GetIcon(const Extension: String): TIcon;
begin
  {...}

  Result := RetrieveIcon(Extension);
end;
Und RetrieveIcon:
Delphi-Quellcode:
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;
Ich habe es versucht mit ".txt", "*.txt" sowie mit dem Namen einer nicht vorhandenen Datei ("test.txt"). In allen Fällen liefert SHGetFileInfo 0.
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?

Chewie 11. Aug 2003 12:15

Re: Symbol eines Dateityps
 
Niemand? :cry:

neolithos 11. Aug 2003 12:27

Re: Symbol eines Dateityps
 
Delphi-Quellcode:
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;
müsstes du nur noch anpassen

Chewie 11. Aug 2003 12:44

Re: Symbol eines Dateityps
 
Alles klar. Ich musste das Flag SHGFI_USEFILEATTRIBUTES setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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