Zjištění ikony asociované k souboru - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Zjištění ikony asociované k souboru

8. června 2001, 00.00 | Článek na jednoduché ukázkové aplikaci vysvětluje, jak v Delphi jednoduše získat handle ikony, která je asociována k souboru.

Jednou z vlastností, kterou Windows oplývají, je automatické přiřazování ikony souborům na základě přípon. Celá tahle záležitost je sice o něco složitější, než pouhý vztah přípona-ikona (teď mě napadá, že je to také téma na samostatný článek), ale to pro náš účel není příliš podstatné. My se totiž budeme zabývat tím, jak ze známého jména souboru tuto ikonu získat.

Tak, když jsme si vymezili úkol, jdeme na jeho plnění. Jak už je u mých článků zvykem, všechno si předvedeme na ukázkové aplikaci (viz obrázek). Princip je následující: Do editboxu uživatel napíše jméno souboru, jehož ikonu chce zobrazit (popřípadě soubor vybere v dialogu pomocí tlačítka Procházet...). Po stisku klávesy Enter se pomocí komponenty TImage zobrazí výsledná ikona.

Ukázková aplikace - zobrazovač ikon

První, co musíme do aplikace "vtělit", je obsluha událostí komponent. Jednak musíme ošetřit kliknutí na tlačítku, kdy by se měl zobrazit dialog umožňující výběr souboru, a po kliknutí na tlačítko Otevřít v tomto dialogu by se měla rovnou zobrazit ikona. Dále musíme zachytit stisk Enteru přímo v editačním políčku a jako reakci opět zobrazit ikonu zadaného souboru. Celý kód vypadá takto:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with OpenDialog1 do
    if Execute then
    begin
      Edit1.Text := FileName;
      ShowIcon;
    end;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    ShowIcon;
end;

Tak, to by byla "omáčka" okolo, nyní přejdeme k implementaci funkce TForm1.ShowIcon, která má za úkol provést samotné zobrazení ikony na formuláři. V proceduře použijeme volání Win32 API funkce SHGetFileInfo. Tato funkce je velice užitečná a umí toho o mnoho víc, než jen zobrazit ikonu (o tom někdy příště...). My ale využijeme jen tuto její funkci. Funkce samotná je deklarována takto:

function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; 
  var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD; stdcall;

Jak je vidět, parametry funkce jsou především jméno souboru a struktura TSHFileInfo - v jejích členech jsou uloženy výsledky našeho dotazu. Posledním důležitým parametrem funkce je "maska" určující, které informace chceme o souboru zjistit. Pro naše účely použijeme hodnotu SHGFI_ICON, která zajišťuje to, že v předané struktuře TSHFileInfo bude po volání funkce ve členu hIcon vrácen handle ikony daného souboru.

Handle použijeme pro nastavení obrázku v komponentě TImage - využijeme zde její vlastnosti Picture, která má zase vlastnost Icon (typu TIcon), což je objekt zapouzdřující v Delphi ikonu. No a jako snad všechny objekty v Delphi zapouzdřující cokoliv z Win32 API má i TIcon vlastnost Handle, kterou nastavíme na hodnotu získanou ze struktury SHFileInfo.

Zdá se vám popis trochu složitý? Pak vás možná překvapí, že samotná výkonná část kódu se pohodlně vejde na dva řádky. Celá procedura ShowIcon vypadá následovně:

procedure TForm1.ShowIcon;
var
  SFI: TSHFileInfo;
begin
  SHGetFileInfo(PChar(Edit1.Text), 0, SFI, SizeOf(SFI), SHGFI_ICON);
  Image1.Picture.Icon.Handle := SFI.hIcon;
end;

Snad bych jen dodal, že je nutno přilinkovat k programu unitu ShellAPI, ve které se nachází námi volaná funkce SHGetFileInfo, a tímto upozorněním také tento článek končím. Takže nashledanou (pardon - napočtenou) zase někdy příště.

Ukázkovou aplikaci i se zdrojovým kódem pro Delphi 3 a vyšší si můžete stáhnout zde.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: