Får den tilhørende ikonet på en fil extension

Denne artikkelen introduserer en funksjon du kan bruke for å skaffe ikonet til en fil eller dokument basert på sin filtypen (dvs. det spiller ingen rolle om filen eller dokumentet finnes på disk eller ikke) ExtractAssociatedIconTo få ikonet til et program eller dokument vi kan bruke denne API-funksjonen (deklarert i ShellAPI enhet): function ExtractAssociatedIcon (hInst: HINST; lpIconPath: PChar; Var lpiIcon: Word): HICON; STDCALL; hInst: application håndtaket. Denne verdien er inneholdt i den forhåndsdefinerte variable HInstance.lpIconPath: En peker til et tegn buffer som skal inneholde en null terminert streng med hele banen navnet på programmet, bibliotek (DLL) eller dokumentet. Hvis det er et dokument, vil funksjonen plassere det hele stien til den tilknyttede programmet fra der ikonet ble trukket ut, så vi bør sette av en buffer stor enough.lpiIcon: Ikonet index (det første ikonet i filen har en indeks på 0). Hvis lpIconPath spesifiserer et dokument, så lpiIcon er satt av funksjon (det er derfor det er gått med referanse) til indeksen plasseringen av selve ikonet tatt fra forbundet kjørbar (definert i filen foreningen) .Return verdi: Hvis funksjonen mislykkes , returnerer den 0. Hvis det lykkes, returnerer den en ikon håndtak, som er et heltall Windows bruker for å identifisere den tildelte ressurs. Det er ikke nødvendig å ringe API DestroyIcon å slippe ikonet siden det vil bli deallocated automatisk når programmet er ferdig, selv om du kan gjøre det hvis du want.SAMPLE CALLNow, hva gjør vi med ikonet håndtere? Normalt hva vi ønsker er et ikon, nemlig og forekomst av Ticon klassen. Alt vi trenger å gjøre er å lage en Ticon objekt og tilordne dette håndtaket til sin Håndtak eiendom. Hvis senere vi tildele Handle eiendommen til en annen verdi, den forrige ikonet vil automatisk bli utgitt. Det samme skjer hvis Ticon objektet er freed.Here er et eksempel som endrer ikonet på formen: bruker SysUtils, Windows, ShellAPI; Prosedyren TForm1.Button1Click (Sender: TObject); Var IconIndex: ord; Buffer: array [0..2048] av røye; IconHandle: HICON; begynne StrCopy (Buffer, 'C: \\ Windows \\ Help \\ Windows.hlp'); IconIndex: = 0; IconHandle: = ExtractAssociatedIcon (hInstance, Buffer, IconIndex); hvis IconHandle < > 0 da Icon.Handle: = IconHandle; enden, GETASSOCIATEDICONUnfortunately, mislykkes ExtractAssociatedIcon hvis filen ikke eksisterer på disken, så vi definert en prosedyre som får ikonet til en fil om det eksisterer eller ikke, og kan også få det lille ikonet (ideelt for en TListView som kan vises i vsIcon eller vsReport vise stiler). Prosedyren mottar tre parametere: filnavn og to pekere til HICON (heltall) variabler: en for stor ikonet (32x32) og en annen for det lille ikonet (16x16). Noen av dem kan være null hvis du ikke trenger en av disse ikonene. Ikonene "fant" av prosedyren må frigjøres med DestroyIcon API. Dette vil bli gjort automatisk hvis du tildele ikonet håndtaket (HICON) til håndtaket tilhører en Ticon objekt (ikonet vil bli lansert når dette objektet blir frigjort eller en ny verdi er tildelt det). bruker SysUtils, Registry, Windows, ShellAPI; skriver PHICON = ^ HICON; Prosedyren GetAssociatedIcon (Filename: TFilename; PLargeIcon, PSmallIcon: PHICON); //Gets ikonene for en gitt fil Var IconIndex: ord; //Plassering av ikonet i filen FileExt, filetype: string; Reg: TRegistry; p: integer; p1, p2: pchar; etiketten noassoc; begynner IconIndex: = 0; //Få filtypen FileExt: = store bokstaver (ExtractFileExt (Filename)); if ((FileExt < > .exe) og (FileExt < > '.ICO')) eller ikke FileExists (Filename) da begynne //Hvis filen er en EXE eller ICO og den finnes, deretter //vi vil trekke ut ikon fra denne filen. Ellers //her vil vi prøve å finne den tilhørende ikonet i //Windows Registry ... Reg: = null; prøv Reg: = TRegistry.Create (KEY_QUERY_VALUE); Reg.RootKey: = HKEY_CLASSES_ROOT; hvis FileExt = 'EXE' da FileExt: = 'Com'; hvis Reg.OpenKeyReadOnly (FileExt) så prøve filetype: = Reg.ReadString (''); endelig Reg.CloseKey; slutt; if (Filetype < > '') og Reg.OpenKeyReadOnly (Filetype + '\\ DefaultIcon') og deretter prøve Filename: = Reg.ReadString (''); endelig Reg.CloseKey; slutt; endelig Reg.Free; slutt; //Hvis vi ikke kunne finne den foreningen, vil vi //prøve å få standardikonene hvis Filename = '' deretter goto noassoc; //Få filnavn og ikonet indeksen fra //forening (av formen '"filaname", index') p1: = PChar (Filename); p2: = StrRScan (p1, ','); hvis p2 < > nil da begynne p: = p2 - p1 + 1; //Plassering av komma IconIndex: = StrToInt (Copy (Filename, p + 1, Lengde (Filename) - p)); SetLength (Filename, p - 1); slutt; slutt; //Forsøk å få ikonet hvis ExtractIconEx (pchar (Filename), IconIndex, PLargeIcon ^, PSmallIcon ^ 1) < > En så beginnoassoc: //Operasjonen mislyktes eller filen hadde ingen forbindelse //ikon. Prøv å få standardikonene fra SHELL32.DLL prøve //​​for å få plasseringen av SHELL32.DLL Filename: = IncludeTrailingBackslash (GetSystemDir) + 'SHELL32.DLL'; bortsett fra Filename: = 'C: \\ WINDOWS \\ SYSTEM \\ SHELL32.DLL'; slutt; //Bestem standardikonet for filtypen if (FileExt = 'DOC') så IconIndex: = 1 else if (FileExt = 'EXE') eller (FileExt = 'Com') så IconIndex: = 2 annet hvis (FileExt = 'HLP') så IconIndex: = 23 else if (FileExt = '.INI') eller (FileExt = 'INF') så IconIndex: = 63 else if (FileExt = 'TXT') så IconIndex: = 64 else if (FileExt = 'BAT') så IconIndex: = 65 else if (FileExt = 'DLL') eller (FileExt = '.SYS') eller (FileExt = '.VBX') eller (FileExt = ' OCX ') eller (FileExt =' VXD ') så IconIndex: = 66 else if (FileExt =' .FON ') så IconIndex: = 67 else if (FileExt =' ttf ') så IconIndex: = 68 annet hvis (FileExt = '.FOT') deretter IconIndex: = 69 annet IconIndex: = 0; //Forsøk å få ikonet. hvis ExtractIconEx (pchar (Filename), IconIndex, PLargeIcon ^, PSmallIcon ^ 1) < > En da begynne //Kunne ikke få ikonet. Bare "retur" nuller. hvis PLargeIcon < > nil deretter PLargeIcon ^: = 0; hvis PSmallIcon < > nil deretter PSmallIcon ^: = 0; slutt; slutt; end; PRØVE CALLThis eksempel vil endre ikonet av skjemaet: prosedyre TForm1.Button1Click (Sender: TObject); Var SmallIcon: HICON; begynne GetAssociatedIcon ('file.doc', nil,SmallIcon); hvis SmallIcon < > 0 da Icon.Handle: = SmallIcon; end;



Previous:
Next Page: