Hrajeme si na Explorer - 7. díl - 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

Hrajeme si na Explorer - 7. díl

27. listopadu 2001, 00.00 | Tak jsme se dopracovali k poslednímu dílu našeho seriálu - dotvoříme v něm spouštění souborů v asociované aplikaci a vybírání více souborů najednou.

Dnešní díl je poslední částí našeho seriálu. Doděláme v něm spouštění souborů v asociovaných aplikacích a také výběr více souborů najednou.

Spouštění souborů

V Průzkumníku ve Windows funguje celkem známá věc - po dvojkliku na souboru je tento spuštěn v aplikaci, která je mu systémem přiřazena na základě jeho přípony. Není těžké tuto funkci implementovat i do našeho programu.

Pokud si dobře vzpomínáte na minulý díl, tak jsme obsluhovali událost seznamu souborů OnDblClick kvůli procházení adresáři. Na úplném konci byla podmínka, která testovala, zda je vybraný objekt adresářem, a pokud jím skutečně byl, tak se do něj program "zanořil". Není nic snazšího než přidat k podmínce else-větev a určit, co se má stát, když objekt adresářem není (tedy když je to soubor). V tom případě ho otevřeme pomocí API funkce ShellExecute, která je (alespoň doufám) poměrně známá a často využívaná, takže se jejím popisem nebudu zabývat. Zde je kód upravené podmínky:

...
// je to opravdu adresář?
if DirectoryExists(RealName) then
begin
  DirEdit.Text := RealName;
  ShowBtnClick(Self); // obnovíme zobrazení
end
else
  ShellExecute(Handle, nil, PChar(RealName), nil,
    PChar(DirEdit.Text), SW_SHOWNORMAL);
...

Vybírání více objektů

Zprovoznění této funkce se skládá ze dvou kroků: úpravy objektů formuláře a pak procedury, která bude zobrazovat počet a velikost vybraných souborů na stavovém řádku.

Především je potřeba seznamu souborů FileView nastavit hodnotu vlastnosti MultiSelect na True. Pak musíme přidat StatusBar, který rozdělíme na dva panely - první bude mít šířku 240 bodů, druhý bude zabírat zbytek.

A můžeme se pustit do "opravdového" programování, kterým v tomto případě bude obsluha události FileView.OnChange. Procedura napojenou na tuto událost je zavolány vždy, když se "něco" ve výpisu souboru změní. Ono neurčité "něco" je obecně text či ikona položky nebo její stav (vybrána/nevybrána).

Naše implementace udělá to, že zjistí počet vybraných položek a sečte jejích velikost (připomínám, že údaje o souboru, které položka představuje, máme uchovány v záznamu typu TSearchRec, na které odkazuje vlastnost položky Data). Poté procedura vypíše příslušný text na stavový řádek. Tento text se poněkud liší podle toho, jestli je vůbec nějaký objekt vybrán nebo ne - víc ale asi prozradí zdrojový kód:

procedure TForm1.FileViewChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
  SelObjectCount, Size, I: Integer;
begin
  SelObjectCount := 0;
  Size := 0;
  // projdeme všechny položky, spočítáme kolik jich
  // je a jejich velikost
  with FileView do
    for I := 0 to Items.Count - 1 do
      if Items[I].Selected then
      begin
        Inc(SelObjectCount);
        Inc(Size, PSearchRec(Items[i].Data)^.Size);
      end;

  // výsledky zapíšeme do stavového řádku
  with StatusBar1 do
    if SelObjectCount = 0 then
    begin
      Panels[0].Text := 'Počet objektů: '
        + IntToStr(FileView.Items.Count);
      Panels[1].Text := '';
    end
    else
    begin
      Panels[0].Text := 'Počet vybraných objektů: '
        + IntToStr(SelObjectCount);
      Panels[1].Text := IntToFileSize(Size);
    end;
end;

V této proceduře jsem se dopustil hned tří nedůsledností v emulaci chování Exploreru. Jednak se nezobrazuje volné a celkové místo na disku v případě, kdy není vybrána žádná položka. To je záměr, protože zjišťování velikosti disku na platformě Win32 není zas tak jednoduché, takže ho protentokrát ponechám stranou.

Druhá nedůslednost je, že Explorer zobrazuje celkovou velikost v různých jednotkách, kdežto náš program jen v kB. Tuto funkci ponechávám pro čtenáře jako "domácí úkol".

Třetí nedůslednost vám prozrazovat nebudu, máte možnost na ni přijít sami. Je to ale opravdu drobnost, i když odstranění by si vyžádalo 5-10 programu řádků navíc.

Závěr

Tímto dílem tedy náš seriál končí (finální verzi aplikace najdete zde). Doufám, že zejména začínajícím uživatelům Delphi pomohl proniknout do některých problémů a že jste se na něm něco nového přiučili, případně získali inspiraci pro vlastní výtvory. U dalšího seriálu nashledanou!

Obsah seriálu (více o seriálu):

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: