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
Dialog pro výběr adresáře
11. července 2001, 00.00 | V článku se dozvíte, jakým způsobem zobrazit v Delphi dialog pro výběr adresáře - a to hned dvěma způsoby.
V mnoha programech má uživatel možnost zadat jako některou položku konfigurace adresář - třeba jako defaultní pro ukládání dokumentů, nebo pro dočasné soubory. Obvykle je v programu u příslušné položky i tlačítko Procházet... nebo nějaké podobné, po jehož aktivaci se zobrazí dialog, ve kterém si uživatel může adresář pohodlně "naklikat". My se nyní budeme zabývat tím, jak takový dialog v Delphi vytvořit a zobrazit.
Cesta prvníAsi víte, že v Delphi jsou na záložce Win3.1 mimo jiné komponenty DirectoryListBox a DriveComboBox. Ty by se nám pro účel dialogu umožňujícího výběr adresáře docela dobře hodily. Jestli teď ale čekáte, že začnu popisovat, jak si s jejich pomocí můžete dialog sestavit, jste na omylu. Tuto činnost už za nás totiž udělali vývojáři Borlandu, a tak máme k dispozici funkci SelectDirectory. Ta zobrazí právě dialog na výběr adresáře, který vidíte na obrázku. Deklarace funkce SelectDirectory (mimochodem, nachází se v unitě FileCtrl) vypadá takto:
|
Funkce vrací True, když uživatel kliknul na tlačítko OK a False když na Cancel. V parametru Directory jí předáme adresář, který chceme v dialogu na začátku nastavit, a po zavolání funkce v něm obdržíme výsledný adresář, který si uživatel vybral. Options je množina (set), která může obsahovat následující hodnoty:
sdAllowCreate | Uživatel může zadat i jméno adresáře, který neexistuje, do editačního políčka, které se objeví pod nápisem "Directory Name". |
sdPerformCreate | Pokud uživatel zadá jméno neexistujícího adresáře, bude automaticky vytvořen. Když tuto volbu nepoužijeme, o vytvoření adresáře se musí postarat programátor sám. Používá se jen s hodnotou sdAllowCreate. |
sdPrompt | Pokud uživatel zadá jméno neexistujícího adresáře, objeví se dialog, který se zeptá, zda má adresář vytvořit. Pokud odpoví, že ano, a je zvoleno sdPerformCreate, adresář se vytvoří. Používá se jen s hodnotou sdAllowCreate. |
Poslední parametr HelpCtx se používá pro připojení nápovědy k dialogu.
Pokud dialog použijete, nejspíš vás napadnou minimálně dva nedostatky:
- Nestandardní design, jiné ikonky adresářů a jednotek, než jsou ve Windows.
- Dialog je anglicky.
Prostě tenhle způsob zobrazení dialogu je fajn, ale má své mouchy. Co byste ale říkali dialogu, který vypadá jako ten na druhém obrázku? Že je lepší, standardní a český? Pojďme se podívat na jeho tvorbu:
Cesta druháDruhý dialog zobrazíme pomocí WIN32 API funkce SHBrowseForFolder. Deklarace (v unitě ShlObj) je následující:
|
Jediný parametr této funkce je záznam s daty pro inicializaci typu TBrowseInfo. Jeho položky shrnuje tabulka:
hwndOwner | handle okna, které dialog vyvolalo |
pidlRoot | ukazatel na strukturu ItemIDList, specifikující defaultní adresář, který bude po zobrazení vybrán |
pszDisplayName | ukazatel na buffer (o délce MAX_PATH), kam se zkopíruje "uživatelsky přívětivé" jméno adresáře (např. u adresáře "C:\Windows\System" vrátí funkce "System") |
lpszTitle | nápis pod titulkem dialogu |
ulFlags | určuje, co všechno můžete v dialogu vybrat (počítač, tiskárnu, složku); nám postačí hodnota BIF_RETURNONLYFSDIRS (výběr souborů) |
lpfn | callback funkce, běžně není potřeba, takže stačí zadat nil |
Pokud uživatel stiskne v dialogu OK, jako výsledek je předán ukazatel na ItemIDList identifikující daný adresář. Pokud stiskne Strono, je předána hodnota nil.
"Moment, co je to ten ItemIDList?" ptáte se teď nejspíš. Zjednodušeně řečeno, je to struktura pro uchovávání identifikátorů všech objektů shellu (což jsou soubory, složky, ale třeba i počítače v síti, systémové složky apod.). Tyto objekty někdy nelze jednoznačně identifikovat jejich jménem (to lze právě jen u souborů a složek), proto se na ně odkazujeme pomocí ItemIDList. Pro náš účel je podstatné, že cesta k souboru či složce se dá ze struktury ItemIDList "vyseparovat" funkcí GetPathFormIDList.
Nyní už víme dost na to, abychom si pomocí SHBrowseForFolder napsali vlastní podobu funkce SelectDirectory. Bude trochu ochuzená: nebude umožňovat tvorbu nových adresářů a kontextový help (to prostě SHBrowseForFolder nepodporuje), ani výběr defaultního adresáře na počátku (to by bylo trochu složitější na implementaci, museli bychom nejspíš zatáhnout do hry interface IShellFolder, a to už by na tenhle článek bylo trochu moc nových věcí najednou). Takže naše nová funkce SelectDirectory vypadá takto:
|
Závěr
Poučení z dnešního článku? Dialog na výběr adresáře můžete v Delphi vyrobit dvěma způsoby. Já jsem vám nastínil oba a je jen na vás, který z nich si vyberete a budete používat ve svých programech.
-
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