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 - 4. díl
3. října 2001, 00.00 | V dnešním dílu seriálu se vrhneme na třídění výpisu
souborů podle jejich názvů, přičemž si mimojiné ukážeme práci s ukazateli.
V dnešním dílu seriálu se vrhneme na třídění výpisu souborů podle jejich názvů, přičemž si mj. ukážeme práci s ukazateli.
PřípravaNež začneme soubory třídit, musíme provést "přípravy". Především je potřeba nastavit komponentě FileView (pro připomenutí: je to ovládací prvek typu TListView, kde se vypisují soubory) vlastnost ColumnClick na hodnotu True. Tím umožníme uživateli, aby klikal na jednotlivá záhlaví ve výpisu (v režimu "Podrobnosti") a tím volil, jak chce soubory setřídit.
Dále si pak potřebujeme v programu pamatovat, podle kterého kritéria jsou soubory právě v této chvíli tříděny, a také zda jsou seřazeny vzestupně či sestupně. Deklarujeme si tedy dva výčtové typy vhodné pro uchovávání těchto informací:
|
Všimněte si, že u TSortCriteria je pořadí možností stejné jako pořadí sloupců v FileView - později toho výhodně využijeme.
Pak zavedeme proměnné těchto dvou typů, ve kterých budeme informace o třídění udržovat. Je vcelku jedno, jestli je deklarujeme jako součást objektu formuláře, nebo jako obyčejné proměnné pomocí klíčového slova var. Já jsem zvolil první možnost:
|
Obě tyto proměnné nemusíme při startu programu nastavovat na žádné iniciační hodnoty, protože v Delphi budou mít automaticky hodnotu první možnosti z výčtu. Po spuštění programu se tedy soubory budou třídit vzestupně podle jména.
Abychom měli všechna data o souborech, která budeme při třídění potřebovat, hezky pohromadě, upravíme proceduru TForm1.ShowBtnClick. Pro každý soubor si zapamatujeme jemu odpovídající strukturu TSearchRec, abychom pak mohli snadno přistupovat k potřebným datům o něm. Do vlastnosti Data každé položky seznamu FileView.Items pak zapíšeme příslušný ukazatel na alokovanou strukturu. Samozřejmě musíme zajistit i opětovné uvolnění zabrané paměti při změně adresáře a ukončení programu. Zde jsou potřebné části kódu, ale lépe vše asi pochopíte, když si stáhnete celý kód programu.
|
Nastavení správného kritéria
Nyní se musíme vypořádat s výběrem kritéria třídění uživatelem. To se odehrává klikáním na záhlaví komponenty FileView, musíme tedy obsloužit její událost OnColumClick. Pokud uživatel kliknul na stejný sloupec, podle kterého třídíme teď, pouze změníme vzestupné třídění na sestupné a naopak. Jinak změníme kritérium třídění podle sloupce, kam kliknul.
|
Všimněte si, že v proceduře je s výhodou použito oboustrnné přetypování mezi typy Integer a TSortCriteria. Podobný postup byl už jednou v programu použit, a to ve druhém dílu seriálu..
TříděníNyní musíme implementovat samotné třídění souborů. Pokud teď čekáte popis nějakého rychlého třídicího algoritmu, jste na omylu. Tento algoritmus je už implementován v komponentě TListView (přessněji už v části Win32 API, které tato komponenta zapouzdřuje), na nás je jenom to, abychom vytvořili porovnávací funkci. Ta dostane dvě položky ze seznamu souborů jako parametry a musí určit jejich pořadí pomocí svého výstupního parametru Compare (ten je typu Integer). Pokud má být první položka před druhou, funkce musí nastavit hodnotu menší než 0, pokud je tomu naopak, nastaví hodnotu větší než 0. Jsou-li obě položky stejné, funkce přiřadí parametru Compare hodnotu 0.
Ještě zbývá dodat, že funkci implementujeme jako obsluhu
události OnCompare komponenty FileView a aby vše
fungovalo, musíme také nastavit vlastnost SortType na stData
(tím komponentě říkáme, že porovnávání položek si
obstaráme sami).
|
Výpis si zaslouží rozbor: Na začátku nastavíme jména obou souborů podle aktivního adresáře a uchovaných dat. Pak program rozvětvíme podle jednotlivých kritérií - pro dnešní díl implementujeme jen to první (třídění podle jména). Pak zjistíme (pomocí funkcí FileExists ze SysUtils a DirectoryExists z FileCtrl), zda jsou oba porovnávané položky adresáře či soubory. Pokud je jedna soubor a druhá adresář, platí pravidlo, že adresáře jsou ve výpisu před soubory. Pokud jsou obě stejného typu, o jejich pořadí rozhodne funkce AnsiStrComp, která porovná oba řetězce (bez ohledu na velikost písmen) a vrátí hodnotu podle stejných pravidel (menší než 0, je li první řetězec abecedně před druhým, atd.), jako potřebujeme zapsat do proměnné Compare.
Nakonec ještě z případě sestupného třídění výsledek vynásobíme -1, aby byla inverze vzata v úvahu.
Třídění aktivujeme tím, že na konec procedur TForm1.ShowBtnClick a TForm1.OnColumnClick přidáme volání metody FileView.AlphaSort.
Huh...Dnešní díl byl trochu delší a náročnější na pochopení (pro začátečníky asi hlavně práce s ukazateli), doporučuji proto prozkoumat důkladně zdrojový kód aplikace.
Příště se podíváme na třídění podle zbylých kritérií.
Obsah seriálu (více o seriálu):
- Hrajeme si na Explorer - 1. díl
- Hrajeme si na Explorer - 2. díl
- Hrajeme si na Explorer - 3. díl
- Hrajeme si na Explorer - 4. díl
- Hrajeme si na Explorer - 5. díl
- Hrajeme si na Explorer - 6. díl
- Hrajeme si na Explorer - 7. díl
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007