Dialog pro výběr adresáře - 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

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í

Dialog pro výběr adresáře č. 1

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:

function SelectDirectory(var Directory: string;
  Options: TSelectDirOpts; HelpCtx: Longint): Boolean;

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á

Dialog pro výběr adresáře č. 2

Druhý dialog zobrazíme pomocí WIN32 API funkce SHBrowseForFolder. Deklarace (v unitě ShlObj) je následující:

function SHBrowseForFolder(var lpbi: TBrowseInfo): PItemIDList; stdcall;

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:

function SelectDirectory2(var Directory: string): Boolean;
var
  BrowseInfo: TBrowseInfo;
  NameBuffer: array[0..MAX_PATH] of Char;
  ItemIDList: pItemIDList;
begin
  with BrowseInfo do
  begin
    hwndOwner := Application.Handle; // handle hlavního formuláře
    pidlRoot  := nil;                // žádný default. adresář
    pszDisplayName := nil;           // nepotřebujeme
    lpszTitle := 'Vyberte adresář:'; // nadpis
    ulFlags := BIF_RETURNONLYFSDIRS; // jdou vybrat jenom fyzicky existující adresáře
    lpfn := nil;                     // žádná callback fce
  end;
  ItemIDList := SHBrowseForFolder(BrowseInfo);
  if ItemIDList <> nil then
  begin
    SHGetPathFromIDList(ItemIDList, NameBuffer); // extrakce cesty z ItemIDListu
    Directory := NameBuffer;
    Result := True;
  end
  else
    Result := False;
end;

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.

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: