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

26. září 2001, 00.00 | V minulém dílu jsme program "naučili" zobrazovat
soubory čtyřmi různými způsoby, přesně jako to dělá
Explorer. Jednu věc jsme ale ponechali nedokončenou - doplnění
dat do sloupců v režimu "Podrobnosti".

V minulém dílu jsme program "naučili" zobrazovat soubory čtyřmi různými způsoby, přesně jako to dělá Explorer. Jednu věc jsme ale ponechali nedokončenou - doplnění dat do sloupců v režimu "Podrobnosti".

V tomto režimu se nám v seznamu zobrazují kromě jména samotného souboru i tři další jeho vlastnosti - velikost, typ a čas poslední změny. Projdeme si je tedy postupně.

Velikost

Velikost souboru zjistíme z vyhledávacího záznamu SearchRec, konkrétně z jeho položky Size. Úkol tedy vypadá jednoduše - pomocí funkce IntToStr tuto hodnotu konvertovat do řetězce a přidat jí k právě zpracovávané položce pomocí metody Subitems.Add... ale: Pokud se podíváme na "skutečný" Explorer podrobněji, zjistíme, že převádí velikosti na kilobajty, přičemž nejmenší zobrazovaná hodnota velikosti souboru je vždy 1 kB (i kdyby byl soubor veliký třeba 1 bajt). Navíc se u velkých čísel používá pro přehlednost mezera jako oddělovač tisíců.

Řešením je deklarace vlastní převodní funkce IntToFileSize, která výše zmíněné aspekty zohlední:

// převod velikosti souboru do řetězce a na kB
function IntToFileSize(Size: Integer): string;
const
  kB = 1024;
begin
  if Size > kB then
    Result := IntToStr(Size div kB) + ' kB'
  else
    Result := '1 kB';
end;

Myslím, že funkce je celkem jasná. Samotné přidání položky pak zařídíme následujícím voláním, které umístíme na konec with-bloku v proceduře TForm1.ShowBtnClick:

SubItems.Add(IntToFileSize(SearchRec.Size));

Typ souboru

Typ souboru zjistíme pro změnu ze struktury SFI (naplněné při volání funkce SHGetFileInfo, která nám zjišťuje různé informace o souboru), z její položky szTypeName. Nejdříve ovšem musíme přimět funkci SHGetFileInfo tuto položku struktury vůbec naplnit, což zařídíme přičtením konstanty SHGFI_TYPENAME k hodnotě jejího posledního parametru (pro připomenutí - v posledním parametru uFlags se nastavují vlajky určující, co všechno chceme o daném souboru zjistit). Celé volání funkce SHGetFileInfo tedy vypadá takto:

SHGetFileInfo
  PChar(DirEdit.Text + '\' + SearchRec.name), // cesta k souboru
  0,                                          // atributy - žádné
  SFI, SizeOf(SFI),                           // struktura TSHFileInfo
  // vlajky: chceme získat index velké ikony a jméno souboru
  SHGFI_SYSICONINDEX + SHGFI_LARGEICON
  + SHGFI_DISPLAYNAME + SHGFI_TYPENAME
);

Nakonec ještě přidání položky do právě zpracovávaného řádku:

SubItems.Add(SFI.szTypeName);

Čas poslední změny

Čas poslední změny opět zjistíme ze SearchRec - použijeme položku Time (typu integer). Čas v ní je nutné převést na typ TDateTime (standardní typu používaný v Delphi na uchovávání data a času) - to zařídíme použitím funkce FileDateToDateTime. Na výsledek zase aplikujeme funkci DateTimeToStr, která čas převede na výsledek v podobě řetězce. Přidání položky tedy vypadá takto:

SubItems.Add(DateTimeToStr(FileDateToDateTime(SearchRec.Time)));

Pokud se na výsledek po spuštění programu podíváme pozorně, neujde nám, že na rozdíl od Exploreru se zobrazují i sekundy v čase změny. Protože chceme být v simulaci Exploreru důslední, odstraníme i tento detail.

V unitě SysUtils je deklarováno několik proměnných, ve které představují formáty data, času, měny apod. V podstatě pro programátora zpřístupňují to, co má uživatel nastaveno v ovládacím panelu Místní nastavení. Z těchto proměnných vychází při převodu na řetězec i použitá funkce DateTimeToStr. Proměnná, určující formát času se jmenuje LongTimeFormat. V českých zemích má obvykle hodnotu "h:mm:ss", ale nic nám nebrání v proceduře TForm1.FormCreate nastavit hodnotu vlastní:

LongTimeFormat := 'h:mm'; // nastavení formátu času

Teď už se bude čas převádět podle našich představ.

Příště

Tímto jsme s naplňováním jednotlivých sloupců daty hotovi. Příště si zkusíme třídění souborů podle jednotlivých kritérií.

Aplikaci ve stavu vývoje po dnešním článku si můžete stáhnout zde.

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: