Immer das Symbol mit einem Dateierweiterung verknüpft

Dieser Artikel stellt eine Funktion, die Sie verwenden können, um das zugehörige Symbol einer Datei oder einem Dokument auf der Grundlage ihrer Erweiterung zu bekommen (dh es spielt keine Rolle, ob die Datei oder das Dokument auf der Festplatte oder nicht)

ExtractAssociatedIcon

Um ein Anwendungssymbol oder ein Dokument können wir diese API-Funktion (in der Einheit ShellAPI deklariert) erhalten, benutzen:



Funktion ExtractAssociatedIcon (hInst: hInst; lpIconPath: PChar;

var lpiIcon: Word): HICON; stdcall;

hInst: Der Griff Anwendung. Dieser Wert wird in der Variablen hInstance Standard enthalten.



lpIconPath: Ein Zeiger auf eine Zeichenpuffer, die eine Null-terminierter String mit dem vollständigen Pfadnamen der Anwendungsbibliothek (DLL) oder ein Dokument enthalten muss. Wenn es ein Dokument, wird die Funktion dort platzieren Sie den vollständigen Pfad der zugehörigen Anwendung, aus der Sie das Symbol extrahiert, dann sollten wir einen Puffer groß genug zuweisen.



lpiIcon: Der Index des Symbols (das erste Symbol in der Datei hat einen Index von 0). Wenn lpIconPath ein bestimmtes Dokument, dann lpiIcon wird durch die Funktion festgelegt (das ist, warum es als Referenz übergeben) für die Indexposition des Symbols aus der zugehörigen ausführbare Datei (in der Dateizuordnung definiert) erstellt.



Rückgabewert: Wenn die Funktion fehlschlägt, wird 0 zurückgegeben, wenn erfolgreich, gibt einen Handle-Symbol, das eine ganze Zahl von Windows verwendet, um die zugewiesene Ressource zu identifizieren. Keine Notwendigkeit, die API DestroyIcon rufen, um das Symbol freizugeben, als es automatisch freigegeben werden, wenn die Anwendung beendet wird, auch wenn Sie es tun, wenn Sie wollen.



Beispiel eines Anrufs

Nun, was haben wir mit dem Griff-Symbol zu tun? Normalerweise, was wir wollen, ist ein Symbol, oder Instanz der Klasse und Ticon. Alles, was wir tun müssen, ist ein Objekt erstellen und zuweisen Ticon diesen Griff seiner Eigenschaft Handle. Wenn Sie später die Handle-Eigenschaft auf einen anderen Wert zuweisen, wird das Symbol oben automatisch freigegeben. Das gleiche gilt, wenn das Objekt freigegeben wird Ticon.



Hier ist ein Beispiel, das das Symbol der Form ändert:



verwendet SysUtils, Windows, ShellAPI;



Verfahren TForm1.Button1Click (Sender: TObject);

var

IconIndex: word;

Puffer: array [0..2048] of Char;

IconHandle: hIcon;

Start

StrCopy (Buffer, 'C: \ Windows \ Help \ Windows.hlp');

IconIndex: = 0;

IconHandle: = ExtractAssociatedIcon (hInstance, Buffer, IconIndex);

wenn 0, dann IconHandle

Icon.Handle: = IconHandle;

Ende;

GETASSOCIATEDICON

Leider scheitert ExtractAssociatedIcon, wenn die Datei nicht auf der Festplatte vorhanden ist, dann haben wir ein Verfahren, das das Symbol einer Datei bekommt, wenn es sie gibt oder nicht, und können sogar das kleine Symbol (ideal für einen TListView, die in vsIcon oder nachgewiesen werden kann, definiert vsReport Ansicht Stile). Das Verfahren dauert drei Parameter: den Namen der Datei und zwei Zeiger auf HICON (integer) Variablen: eine für große Symbol (32x32) und ein weiteres für das kleine Symbol (16x16). Jeder von ihnen kann null sein, wenn Sie nicht brauchen, eines dieser Symbole. Die Symbole "zurückgegeben" aus dem Verfahren muss mit der API DestroyIcon befreit werden. Dies geschieht automatisch, wenn Sie auf das Symbol Griff (HICON) an die Handle-Eigenschaft eines Objekts Ticon zuweisen (das Symbol wird freigesetzt, wenn diese Aufgabe gelöst wird oder ein neuer Wert zugewiesen werden).



SysUtils verwendet, Registry, Windows, ShellAPI;



So'ne Art

PHICON = ^ HICON;



Verfahren GetAssociatedIcon (Dateiname: TFileName;

PLargeIcon, PSmallIcon: PHICON);

// Ruft die Symbole einer bestimmten Datei

var

IconIndex: word; // Position Symbol in der Datei

FileExt, Dateityp: string;

Reg: TRegistry;

p: integer;

p1, p2: PChar;

Etikett

noassoc;

Start

IconIndex: = 0;

// Die Dateierweiterung

FileExt: = Uppercase (ExtractFileExt (Filename));

if ((FileExt 'exe') und (FileExt 'ICO')) oder

nicht FileExists (Dateiname) dann beginnen

// Wenn die Datei eine EXE-oder ICO und existiert, dann

// Wir extrahieren Symbol aus dieser Datei. Sonst

// Hier werden wir versuchen, das Symbol mit dem verbunden zu finden

// Windows Registry ...

Reg: = nil;

versuchen

Reg: = TRegistry.Create (KEY_QUERY_VALUE);

Reg.RootKey: = HKEY_CLASSES_ROOT;

wenn FileExt = 'exe', dann FileExt: = 'Tube';

wenn Reg.OpenKeyReadOnly (FileExt), dann

versuchen

Filetype: Reg.ReadString = ('');

endlich

Reg.CloseKey;

Ende;

if (filetype '') und Reg.OpenKeyReadOnly (

Filetype + '\ DefaultIcon'), dann

versuchen

Filename: = Reg.ReadString ('');

endlich

Reg.CloseKey;

Ende;

endlich

Reg.Free;

Ende;



// Wenn wir nicht in der Lage, den Verein zu finden, wird es

// Versuchen Sie, die Standard-Icons erhalten

Wenn filename = '' then goto noassoc;



// Den Namen der Datei und das Symbol Index aus dem Erhalten

// Association (der Form '"filaname' index ')

p1: = PChar (Filename);

p2: = StrRScan (p1, ',');

wenn p2 nil dann beginnen

p: = p2 - p1 + 1; // Position der Dezimalstelle

IconIndex: = StrToInt (Copy (Filename, p + 1,

Länge (Filename) - p));

SetLength (Filename, p - 1);

Ende;

Ende;

// Tastete das Symbol erhalten

wenn ExtractIconEx (pchar (Filename), IconIndex,

PLargeIcon ^ ^ PSmallIcon, 1) 1 ist, dann

Start

noassoc:

// Operation fehlgeschlagen, oder die Datei nicht verbunden war

// Icon. Versuchen Sie, die Standard-Icons von SHELL32.DLL bekommen



// Versuchen, die Lage der SHELL32.DLL bekommen

Filename: = IncludeTrailingBackslash (GetSystemDir)

+ 'SHELL32.DLL';

außer

"C: \ WINDOWS \ SYSTEM \ SHELL32.DLL '=: Name der Datei;

Ende;

// Bestimmen Sie das Standardsymbol für die Dateierweiterung

if (FileExt = 'Doc'), dann IconIndex: = 1

else if (FileExt = 'exe')

oder (FileExt = 'COM'), dann IconIndex: = 2

else if (FileExt = 'HLP), dann IconIndex: = 23

else if (FileExt = 'ini')

oder (FileExt = 'INF'), dann IconIndex: = 63

else if (FileExt = 'txt'), dann IconIndex: = 64

else if (FileExt = 'bat'), dann IconIndex: = 65

else if (FileExt = 'dll')

oder (FileExt = '.SYS')

oder (FileExt = '.VBX')

oder (FileExt = 'OCX')

oder (FileExt = '.VXD'), dann IconIndex: = 66

else if (FileExt = '.FON'), dann IconIndex: = 67

else if (FileExt = 'TTF), dann IconIndex: = 68

else if (FileExt = '.FOT'), dann IconIndex: = 69

Ein weiterer IconIndex: = 0;

// Tastete das Symbol erhalten.

wenn ExtractIconEx (pchar (Filename), IconIndex,

PLargeIcon ^ ^ PSmallIcon, 1) 1 ist, dann

Start

// Kann das Symbol erhalten. Nur Nullen "RETURN".

wenn PLargeIcon nil dann PLargeIcon ^: = 0;

wenn PSmallIcon nil dann PSmallIcon ^: = 0;

Ende;

Ende;

Ende;

Beispiel eines Anrufs

Dieses Beispiel wird das Symbol der Form zu ändern:



Verfahren TForm1.Button1Click (Sender: TObject);

var

SmallIcon: HICON;

Start

GetAssociatedIcon ('file.doc', nil, SmallIcon);

wenn 0, dann SmallIcon

Icon.Handle: = SmallIcon;

Ende;

(0)
(0)

Kommentare - 0

Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha