Immer das entsprechende Symbol einer Datei-Erweiterung
Dieser Artikel stellt eine Funktion, die Sie verwenden können, erhalten Sie das entsprechende Symbol einer Datei oder Dokument basierend auf der Dateierweiterung (d.h. ist es egal, ob die Datei oder das Dokument auf der Festplatte vorhanden ist)
ExtractAssociatedIcon
Das Symbol für ein Programm oder Dokument können wir diese API-Funktion (in der Einheit ShellAPI deklariert) abrufen:
function ExtractAssociatedIcon(hInst: HINST; lpIconPath: PChar;
var lpiIcon: Word): HICON; stdcall;
hInst: Handle die Anwendung. Dieser Wert ist in den vordefinierten Variablen HInstance enthalten.
lpIconPath: Ein Zeiger auf einen Zeichenpuffer, der eine null beendete Zeichenfolge mit den vollständigen Pfadnamen der Anwendung, Bibliothek (DLL) oder Dokument enthalten sollte. Wenn es sich um ein Dokument handelt, stellen die Funktion gibt den vollständigen Pfadnamen der zugehörigen Anwendung aus wo das Symbol extrahiert wurde, damit sollten wir einen Puffer groß genug zu reservieren.
lpiIcon: Die Symbolindex (das erste Symbol in der Datei hat den Index 0). LpIconPath gibt ein Dokument, dann LpiIcon wird festgelegt, indem die Funktion (das ist, warum es wird als Verweis übergeben) auf die Indexposition des tatsächlichen Symbols die zugehörige ausführbare Datei (definiert in der Dateizuordnung) entnommen.
Rückgabewert: Wenn die Funktion fehlschlägt, gibt 0 zurück. Wenn es erfolgreich ist, gibt es einen Icon-Handle, der einen ganzzahligen Wert, den Windows verwendet ist, um die zugeordnete Ressource zu identifizieren. Es ist nicht für einen Aufruf der API DestroyIcon um das Symbol zu lösen, da es automatisch aufgehoben werde wenn die Anwendung beendet, obwohl Sie es tun können, wenn Sie möchten.
BEISPIELAUFRUF
Nun, was tun wir mit dem Symbolhandle? Normalerweise was wir wollen ist ein Symbol, nämlich und Instanz der Klasse TIcon. Alles, was wir tun müssen ist ein TIcon-Objekt erstellen und dieses Handle auf die Handle-Eigenschaft zuweisen. Wenn wir später die Handle-Eigenschaft auf einen anderen Wert zuweisen, werden der Symbol 'vorherige' automatisch erscheint. Das gleiche passiert, wenn das TIcon-Objekt freigegeben wird.
Hier ist ein Beispiel, das ändert sich das Symbol des Formulars:
uses SysUtils, Windows, ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
IconIndex: word;
Buffer: array[0..2048] of char;
IconHandle: HIcon;
begin
StrCopy(@Buffer, 'C:\Windows\Help\Windows.hlp');
IconIndex := 0;
IconHandle := ExtractAssociatedIcon(HInstance, Buffer, IconIndex);
if IconHandle <> 0 then
Icon.Handle := IconHandle;
end;
GETASSOCIATEDICON
Leider wird ExtractAssociatedIcon, wenn die Datei nicht auf dem Datenträger vorhanden ist, so dass wir ein Verfahren definiert, die das Symbol einer Datei Ruft ab, ob es oder nicht existiert, und kann auch das kleine Symbol (ideal für eine TListView, die in VsIcon oder VsReport-Formatvorlagen angezeigt werden kann). Die Prozedur erhält drei Parameter: den Dateinamen und zwei Zeiger auf HICON (Ganzzahl) Variablen: eine für das große Symbol (32 x 32) und ein weiteres für das kleine Symbol (16 x 16). Einer von ihnen kann NULL, wenn Sie eines dieser Icons nicht brauchen. Die Symbole 'zurückgegeben', von der Prozedur müssen mit der DestroyIcon-API freigegeben werden. Dies erfolgt automatisch wenn Sie das Icon-Handle (HICON) zuweisen der Handle-Eigenschaft eines TIcon-Objekts (das Symbol wird freigegeben werden, wenn dieses Objekt freigegeben Ruft oder ein neuer Wert zugewiesen).
uses SysUtils, Registry, Windows, ShellAPI;
type
PHICON = ^HICON;
procedure GetAssociatedIcon(FileName: TFilename;
PLargeIcon, PSmallIcon: PHICON);
// Gets the icons of a given file
var
IconIndex: word; // Position of the icon in the file
FileExt, FileType: string;
Reg: TRegistry;
p: integer;
p1, p2: pchar;
label
noassoc;
begin
IconIndex := 0;
// Get the extension of the file
FileExt := UpperCase(ExtractFileExt(FileName));
if ((FileExt <> '.EXE') and (FileExt <> '.ICO')) or
not FileExists(FileName) then begin
// If the file is an EXE or ICO and it exists, then
// we will extract the icon from this file. Ansonsten
Hier werden wir versuchen, das entsprechende Symbol im finden der
Windows-Registrierung...
Reg: = Nil;
versuchen Sie
Reg: = TRegistry.Create(KEY_QUERY_VALUE);
Reg.RootKey: = HKEY_CLASSES_ROOT;
Wenn Dateiendung = '. EXE' dann Dateiendung: = '. COM';
Wenn Reg.OpenKeyReadOnly(FileExt) dann
versuchen Sie
FileType: = Reg.ReadString (');
Schließlich
Reg.CloseKey;
Ende;
Wenn (FileType <> '') und Reg.OpenKeyReadOnly ()
FileType + '\DefaultIcon') dann
versuchen Sie
FileName: = Reg.ReadString (');
Schließlich
Reg.CloseKey;
Ende;
Schließlich
Reg.Free;
Ende;
Wenn wir die Vereinigung nicht finden konnten, werden wir
versuchen Sie, die Standard-Icons zu bekommen
Wenn FileName = '' dann Goto Noassoc;
Ermittelt den Dateinamen und Symbol Index aus der
Verein (der Form ' 'Filaname' Index ')
P1: = PChar(FileName);
P2: = StrRScan (p1, ',');
Wenn p2 <> NULL dann beginnen
p: = p2 - p1 + 1; Stellung des Kommas
IconIndex: = StrToInt (Kopie (FileName, p + 1,
Length(filename) - p));
SetLength (FileName, p - 1);
Ende;
Ende;
Versuch, das Symbol zu bekommen
Wenn ExtractIconEx(pchar(FileName), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1 dann
beginnen
Noassoc:
Der Vorgang ist fehlgeschlagen, oder die Datei hatte keiner verbunden
das Symbol. Versuchen Sie, die Standard-Icons von SHELL32. DLL
versuchen Sie / /, um die Position des SHELL32 abzurufen. DLL
FileName: = IncludeTrailingBackslash(GetSystemDir)
+ 'SHELL32. DLL';
mit Ausnahme von
FileName: = ' C:\WINDOWS\SYSTEM\SHELL32. DLL';
Ende;
Das Standard-Icon für die Dateiendung ermitteln
Wenn (Dateiendung = '. DOC') dann IconIndex: = 1
elseif (Dateiendung = '. EXE')
oder (Dateiendung = '. COM') dann IconIndex: = 2
elseif (Dateiendung = '. HLP') dann IconIndex: = 23
elseif (Dateiendung = '. INI')
oder (Dateiendung = '. INF') dann IconIndex: = 63
elseif (Dateiendung = '. TXT') dann IconIndex: = 64
elseif (Dateiendung = '. Fledermaus ') dann IconIndex: = 65
elseif (Dateiendung = '. DLL')
oder (Dateiendung = '. SYS)
oder (Dateiendung = '. VBX')
oder (Dateiendung = '. OCX')
oder (Dateiendung = '. VXD') dann IconIndex: = 66
elseif (Dateiendung = '. FON') dann IconIndex: = 67
elseif (Dateiendung = '. TTF') dann IconIndex: = 68
elseif (Dateiendung = '. FOT') dann IconIndex: = 69
sonst IconIndex: = 0;
Versuchen Sie, das Symbol zu erhalten.
Wenn ExtractIconEx(pchar(FileName), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1 dann
beginnen
Konnte das Symbol abrufen. Nur Nullen 'zurück'.
Wenn PLargeIcon <> NULL dann PLargeIcon ^: = 0;
Wenn PSmallIcon <> NULL dann PSmallIcon ^: = 0;
Ende;
Ende;
Ende;
BEISPIELAUFRUF
In diesem Beispiel ändert sich das Symbol des Formulars:
procedure TForm1.Button1Click(Sender: TObject);
var
SmallIcon: HICON;
begin
GetAssociatedIcon('file.doc', nil, @SmallIcon);
if SmallIcon <> 0 then
Icon.Handle := SmallIcon;
end;
Immer das entsprechende Symbol einer Datei-Erweiterung
Immer das entsprechende Symbol einer Datei-Erweiterung : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Dieser Artikel stellt eine Funktion, die Sie verwenden können, erhalten Sie das entsprechende Symbol einer Datei oder Dokument basierend auf der Dateierweiterung (d.h. ist es egal, ob die Datei oder das Dokument auf der Festplatte vorhanden ist)
ExtractAssociatedIcon
Das Symbol für ein Programm oder Dokument können wir diese API-Funktion (in der Einheit ShellAPI deklariert) abrufen:
function ExtractAssociatedIcon(hInst: HINST; lpIconPath: PChar;
var lpiIcon: Word): HICON; stdcall;
hInst: Handle die Anwendung. Dieser Wert ist in den vordefinierten Variablen HInstance enthalten.
lpIconPath: Ein Zeiger auf einen Zeichenpuffer, der eine null beendete Zeichenfolge mit den vollständigen Pfadnamen der Anwendung, Bibliothek (DLL) oder Dokument enthalten sollte. Wenn es sich um ein Dokument handelt, stellen die Funktion gibt den vollständigen Pfadnamen der zugehörigen Anwendung aus wo das Symbol extrahiert wurde, damit sollten wir einen Puffer groß genug zu reservieren.
lpiIcon: Die Symbolindex (das erste Symbol in der Datei hat den Index 0). LpIconPath gibt ein Dokument, dann LpiIcon wird festgelegt, indem die Funktion (das ist, warum es wird als Verweis übergeben) auf die Indexposition des tatsächlichen Symbols die zugehörige ausführbare Datei (definiert in der Dateizuordnung) entnommen.
Rückgabewert: Wenn die Funktion fehlschlägt, gibt 0 zurück. Wenn es erfolgreich ist, gibt es einen Icon-Handle, der einen ganzzahligen Wert, den Windows verwendet ist, um die zugeordnete Ressource zu identifizieren. Es ist nicht für einen Aufruf der API DestroyIcon um das Symbol zu lösen, da es automatisch aufgehoben werde wenn die Anwendung beendet, obwohl Sie es tun können, wenn Sie möchten.
BEISPIELAUFRUF
Nun, was tun wir mit dem Symbolhandle? Normalerweise was wir wollen ist ein Symbol, nämlich und Instanz der Klasse TIcon. Alles, was wir tun müssen ist ein TIcon-Objekt erstellen und dieses Handle auf die Handle-Eigenschaft zuweisen. Wenn wir später die Handle-Eigenschaft auf einen anderen Wert zuweisen, werden der Symbol 'vorherige' automatisch erscheint. Das gleiche passiert, wenn das TIcon-Objekt freigegeben wird.
Hier ist ein Beispiel, das ändert sich das Symbol des Formulars:
uses SysUtils, Windows, ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
IconIndex: word;
Buffer: array[0..2048] of char;
IconHandle: HIcon;
begin
StrCopy(@Buffer, 'C:\Windows\Help\Windows.hlp');
IconIndex := 0;
IconHandle := ExtractAssociatedIcon(HInstance, Buffer, IconIndex);
if IconHandle <> 0 then
Icon.Handle := IconHandle;
end;
GETASSOCIATEDICON
Leider wird ExtractAssociatedIcon, wenn die Datei nicht auf dem Datenträger vorhanden ist, so dass wir ein Verfahren definiert, die das Symbol einer Datei Ruft ab, ob es oder nicht existiert, und kann auch das kleine Symbol (ideal für eine TListView, die in VsIcon oder VsReport-Formatvorlagen angezeigt werden kann). Die Prozedur erhält drei Parameter: den Dateinamen und zwei Zeiger auf HICON (Ganzzahl) Variablen: eine für das große Symbol (32 x 32) und ein weiteres für das kleine Symbol (16 x 16). Einer von ihnen kann NULL, wenn Sie eines dieser Icons nicht brauchen. Die Symbole 'zurückgegeben', von der Prozedur müssen mit der DestroyIcon-API freigegeben werden. Dies erfolgt automatisch wenn Sie das Icon-Handle (HICON) zuweisen der Handle-Eigenschaft eines TIcon-Objekts (das Symbol wird freigegeben werden, wenn dieses Objekt freigegeben Ruft oder ein neuer Wert zugewiesen).
uses SysUtils, Registry, Windows, ShellAPI;
type
PHICON = ^HICON;
procedure GetAssociatedIcon(FileName: TFilename;
PLargeIcon, PSmallIcon: PHICON);
// Gets the icons of a given file
var
IconIndex: word; // Position of the icon in the file
FileExt, FileType: string;
Reg: TRegistry;
p: integer;
p1, p2: pchar;
label
noassoc;
begin
IconIndex := 0;
// Get the extension of the file
FileExt := UpperCase(ExtractFileExt(FileName));
if ((FileExt <> '.EXE') and (FileExt <> '.ICO')) or
not FileExists(FileName) then begin
// If the file is an EXE or ICO and it exists, then
// we will extract the icon from this file. Ansonsten
Hier werden wir versuchen, das entsprechende Symbol im finden der
Windows-Registrierung...
Reg: = Nil;
versuchen Sie
Reg: = TRegistry.Create(KEY_QUERY_VALUE);
Reg.RootKey: = HKEY_CLASSES_ROOT;
Wenn Dateiendung = '. EXE' dann Dateiendung: = '. COM';
Wenn Reg.OpenKeyReadOnly(FileExt) dann
versuchen Sie
FileType: = Reg.ReadString (');
Schließlich
Reg.CloseKey;
Ende;
Wenn (FileType <> '') und Reg.OpenKeyReadOnly ()
FileType + '\DefaultIcon') dann
versuchen Sie
FileName: = Reg.ReadString (');
Schließlich
Reg.CloseKey;
Ende;
Schließlich
Reg.Free;
Ende;
Wenn wir die Vereinigung nicht finden konnten, werden wir
versuchen Sie, die Standard-Icons zu bekommen
Wenn FileName = '' dann Goto Noassoc;
Ermittelt den Dateinamen und Symbol Index aus der
Verein (der Form ' 'Filaname' Index ')
P1: = PChar(FileName);
P2: = StrRScan (p1, ',');
Wenn p2 <> NULL dann beginnen
p: = p2 - p1 + 1; Stellung des Kommas
IconIndex: = StrToInt (Kopie (FileName, p + 1,
Length(filename) - p));
SetLength (FileName, p - 1);
Ende;
Ende;
Versuch, das Symbol zu bekommen
Wenn ExtractIconEx(pchar(FileName), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1 dann
beginnen
Noassoc:
Der Vorgang ist fehlgeschlagen, oder die Datei hatte keiner verbunden
das Symbol. Versuchen Sie, die Standard-Icons von SHELL32. DLL
versuchen Sie / /, um die Position des SHELL32 abzurufen. DLL
FileName: = IncludeTrailingBackslash(GetSystemDir)
+ 'SHELL32. DLL';
mit Ausnahme von
FileName: = ' C:\WINDOWS\SYSTEM\SHELL32. DLL';
Ende;
Das Standard-Icon für die Dateiendung ermitteln
Wenn (Dateiendung = '. DOC') dann IconIndex: = 1
elseif (Dateiendung = '. EXE')
oder (Dateiendung = '. COM') dann IconIndex: = 2
elseif (Dateiendung = '. HLP') dann IconIndex: = 23
elseif (Dateiendung = '. INI')
oder (Dateiendung = '. INF') dann IconIndex: = 63
elseif (Dateiendung = '. TXT') dann IconIndex: = 64
elseif (Dateiendung = '. Fledermaus ') dann IconIndex: = 65
elseif (Dateiendung = '. DLL')
oder (Dateiendung = '. SYS)
oder (Dateiendung = '. VBX')
oder (Dateiendung = '. OCX')
oder (Dateiendung = '. VXD') dann IconIndex: = 66
elseif (Dateiendung = '. FON') dann IconIndex: = 67
elseif (Dateiendung = '. TTF') dann IconIndex: = 68
elseif (Dateiendung = '. FOT') dann IconIndex: = 69
sonst IconIndex: = 0;
Versuchen Sie, das Symbol zu erhalten.
Wenn ExtractIconEx(pchar(FileName), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1 dann
beginnen
Konnte das Symbol abrufen. Nur Nullen 'zurück'.
Wenn PLargeIcon <> NULL dann PLargeIcon ^: = 0;
Wenn PSmallIcon <> NULL dann PSmallIcon ^: = 0;
Ende;
Ende;
Ende;
BEISPIELAUFRUF
In diesem Beispiel ändert sich das Symbol des Formulars:
procedure TForm1.Button1Click(Sender: TObject);
var
SmallIcon: HICON;
begin
GetAssociatedIcon('file.doc', nil, @SmallIcon);
if SmallIcon <> 0 then
Icon.Handle := SmallIcon;
end;
Immer das entsprechende Symbol einer Datei-Erweiterung
By Wiezutun
Immer das entsprechende Symbol einer Datei-Erweiterung : Mehreren tausend Tipps, um Ihr Leben einfacher machen.