|
|
|
Vydáno dne 08. 08. 2005 (3912 přečtení) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Vlastnost | Popis |
| Caption | Popis akce, který se bude zobrazovat například v menu. |
| Enabled | Informace o tom, zda je akci možné vykonat či nikoliv. |
| Hint | Nápovědný text zobrazující se například jako bublinková nápověda. |
| ShortCut | Klávesová zkratka. |
| Visible | Viditelnost akce (například v menu). |
| OnExecute | OnExecute |
| OnUpdate | Událost, která se vyvolává v době nečinnosti aplikace (Idle time) nebo při změně seznamu akcí. Je to ideální místo pro nastavení vlastnosti Enabled či Visible dané akce. |
Všechny třídy, které jsou odvozené od TControl (tedy de
facto všechny vizuální komponenty) dědí vlastnost Action,
které lze přiřadit jednu z akcí definovaných právě v našem seznamu
akcí. Navíc existují třídy, které - ač nemají TControl za
předka - vlastnost Action mají (například položky menu
TMenuItems).
Pojďme si v praxi ukázat, jak se s těmito akcemi pracuje. Do projektu si
vložte komponenty ActionList, MainMenu,
TButton a TEdit. V seznamu akcí si vytvořte novou
akci, můžete si definovat popisku a klávesovou zkratku. Obsloužíme obě
události popsané v tabulce následujícím způsobem:
procedure TForm1.Action1Execute(Sender: TObject);
begin
ShowMessage ('Akce vykonána.');
end;
procedure TForm1.Action1Update(Sender: TObject);
begin
TAction (Sender).Enabled := Edit1.Text <> '';
end;

Tedy v případě spuštění akce se zobrazí krátká zpráva a v případě aktualizace se tato povolí či zakáže v závislosti na tom, zda je ve vstupní lince nějaký text.
A teď dojde k zásadnímu kroku: V menu si vytvořte jednu položku a
vlastnosti Action přiřaďte právě vytvořenou akci. Podobně
přiřaďte akci k tlačítku. Ještě v době návrhu si všimněte dvou
věcí: text, který je ve vlastnosti Caption akce, se objeví jak
na tlačítku, tak v menu. Přiřazená klávesová zkratka se taktéž objeví
v položce menu. Pokud tyto vlastnosti u akce změníte, dojde samozřejmě ke
změně u prvků, které mají tuto akci přiřazenou.
Nyní aplikaci spusťte a vymažte všechen text, který se nachází ve vstupním řádku. Uvidíte, že se položka menu i tlačítko stanou nepřístupnými a akci nevyvoláte ani přiřazenou klávesovou zkratkou. Po napsání libovolného textu je akce opět dostupná a lze ji spouštět.
Ještě předtím, než se podíváme dál, si všimněme u komponenty
TActionList vlastnosti Images. Sem můžete přiřadit
seznam obrázků (komponenta TImageList), které se následně
mohou zobrazovat v menu, v nástrojových lištách a podobně. Výhodou je, že
pokud bude potřebovat změnit obrázek například pro uložení práce,
stačí změnu provést na jediném místě (tedy v našem správci událostí)
a ta se promítne do všech ostatních ovládacích prvků.
Posledně bylo řečeno, že je nepsaným standardem začít uživatelskou nabídku položkou Soubor (File) následovanou Úpravami (Edit) a tak dále. Toto vývojáři Delphi samozřejmě vědí a proto v kontextové nabídce návrháře menu existuje položka Insert from template..., která vyvolá dialog, kde si můžete vybrat položky, které chcete do upravovaného menu vložit. Jistě to ušetří pár drahocenných minut.
Nevýhodou je, že uvedený způsob je nepoužitelný jednak v případě používání seznamu akcí popsaným výše a jednak pokud vyvíjíte aplikaci mluvící českým jazykem.
Jestliže se podíváte na libovolné správně navržené menu, zjistíte,
že některá písmenka jsou podtržená (pozor na Windows 2000, zde to platí
pouze pokud menu zvolíte z klávesnice, nikoliv myší). Toho lze dosáhnout
dvěma způsoby. První - jednodušší - je využít vlastnosti
AutoHotKey komponenty TMainMenu. Ta za vás zajistí
automatické podtrhávání písmenek jednotlivých položek v menu. Druhá -
časově náročnější - je určovat pomocí speciálního znaku (tím je
ampersand) písmenko, které vám vyhovuje. Tedy například "&Otevřít
soubor…".
Ačkoliv se zdá, že první možnost je ta správná, není to tak docela pravda. Vezmu si opět na paškál nenáviděný Word a jeho verze 97 a 2000. Pokud jste využívali u příkazů, které neměly klávesovou zkratku, vyvolání stylem Alt+písmenko menu a následně zvolili písmenko položky menu, pak víte, že díky změně v nabídce mezi verzemi došlo k prohození těchto písmenek. Nebuďte proto líní a používejte druhý způsob, aby nedocházelo k podobným zrůdnostem i ve vašich aplikacích.
Poslední poznámka se týká oddělování příkazů v menu pomocí
vodorovné linky. Toho dosáhnete vložením pomlčky do vlastnosti
Caption položky menu.

V minulém povídání bylo
řečeno, že jsou dva základní způsoby (které není vhodné měnit), kam
umisťovat popisky k některým objektům, jako je například editační
řádka. Jestliže používáte umístění před objektem, pak dochází při
standardní vložení na formulář k jedné nepříjemnosti: popiska je buďto
moc nahoře nebo moc dole a přitom by měla být uprostřed. K tomu slouží
jednoduchá pomůcka: umístěte ji tak, aby spodní části byly zarovnané a
pak popisku pomocí klávesové zkratky Ctrl+šipka nahoru posuňte o tři
obrazovkové body nahoru. V Delphi 6 přichází na pomoc komponenta
TLabeledEdit, což je spojení komponent TEdit a
TLabel v jedinou. Zarovnání textu je pak děláno automaticky v
rámci komponenty a vy se nemusíte o nic starat.
Když už jsme u těchto klávesových zkratek, pak pomocí Shift+kursorová šipka měníte velikost objektu o jednu jednotku a pomocí Ctrl+Shift+kursorová šipka posouváte objekt o hodnotu velikosti mřížky formuláře.
Další záludností je umisťování prvků do dialogu. Občas potřebujete prvek vycentrovat, jindy chcete, aby vybrané prvky byly zarovnány nalevo, či aby měly od sebe stejné rozestupy. K tomu slouží dva nástroje. První je jednorázový: v kontextovém menu formuláře zvolte položku Align... a zde si vyberte požadovanou akci. Pokud chcete těchto zarovnávání dělat více, vyberte v menu View položku Alignment palette. Zobrazí se pomocné okno, kterým můžete poměrně pohodlně dělat na formuláři potřebné operace.

Při tvorbě dialogu je občas potřeba mít v tomto více ovládacích
prvků, než je zdrávo. Je proto více než vhodné použít komponentu
TPageControl, která umožní rozložit tyto prvky na více
záložek a dialog tím nejen zpřehlednit, ale i zpřístupnit lidem s menším
rozlišením. Dalšího "zlidštění" dosáhnete pomocí rozdělení prvků do
skupin. K tomu lze použít jak komponenty TPanel tak třeba
TGroupBox. Naprosto neprofesionálně a odstrašujícím způsobem
je to například uděláno v dialogu Preferences aplikace Photoshop 6, kde
místo záložek je rozbalovací seznam (ComboBox) nebo lze použít tlačítka
Prev a Next, pomocí kterých lze mezi jednotlivými částmi dialogu
přecházet.
Častou chybou začátečníků je nesprávné používání radiových
tlačítek. Na formulář vloží několik komponent TRadioButton a
pracují s nimi. To sice není ještě tak na závadu. Horší to je v
případě, kdy potřebují mít těchto skupin více. To již buďto narazí
nebo problém vyřeší pomocí různých panelů a podobně. Ovšem
nejčistějším řešením je použít komponenty TRadioGroup a
nastavenou hodnotu zjišťovat pomocí vlastnosti ItemIndex.

Pamatujte si, že čím kratší cesta k výsledku, tím lépe. Je proto
lepší použít právě radiových přepínačů než třeba rozbalovacích
seznamů (komponenta TComboBox). Opět uvedu příklad zrůdnosti,
které se dopouštějí vývojáři Microsoftu na uživatelích. Pokud končíte
práci s Windows, můžete si zvolit, co přesně chcete udělat: zda vypnout
počítač, odhlásit se, restartovat či něco jiného. Před Windows 2000 tato
nabídka byla volena právě pomocí radiových tlačítek, ovšem pak přišel
nějaký "chytrák", který řekl, že to bude v rozbalovacím seznamu. Tím
pádem musí každý uživatel celou dobu práce s počítačem pamatovat na to,
že mu musí vybýt sil na jedno kliknutí navíc, než byl dosud zvyklý. Pokud
na to zapomene, má smůlu a zcela vysílen již nebude schopen buďto vypnout
počítač nebo dojít do postele (hospody).
Kapitolu o dialozích uzavřeme velmi důležitým pravidlem: Každý dialog či akce musí jít zrušit (typicky klávesou Escape) a také je dobré dát uživateli možnost potvrdit odkudkoliv provedené změny klávesou Enter (tedy bez nutnosti přecházet na tlačítko OK).
V tabulce vlastností akce byla mj. uvedena vlastnost Hint.
Text, který je nastaven, se zobrazuje v podobě bublinkové nápovědy u
tlačítek apod. (Samozřejmě pokud je nastavena vlastnost
ShowHint na True.)
Existuje však možnost, jak z této vlastnosti získat více. Představte si aplikaci, která kromě zobrazování bublinkové nápovědy zobrazí podrobnější text například ve stavové řádce. Tohoto efektu dosáhnete velmi jednoduše. Text nápovědy je potřeba mít zadán ze dvou částí. První, která se zobrazovat právě v bublinkové nápovědě a druhé, která se zobrazí ve stavové řádce. Obě části spojte kolmítkem a vložte do vlastnosti Hint.
To ale ještě není vše. Nyní musíte napsat obsluhu události
OnHint komponenty TApplicationEvents. Tam ale stačí
dodat jediný řádek, který vezme druhou část z hodnoty Hint a
vloží na stavový řádek:
procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.SimpleText := GetLongHint(Application.Hint);
end;
Ještě předtím, než uvedete produkt do ostrého provozu, domluvte se s několika uživateli a dejte jim produkt na otestování. Sledujte každou jejich akci a způsob, jak se k ní dostanou. Měli byste znát, které akce se používají nejčastěji a ty dát k dispozici tím nerychlejším způsobem (začátek menu, tlačítka na nástrojové liště, klávesové zkratky) a pak akce, které se nepoužívají téměř vůbec, které mohou být skryty například hlouběji v menu.
Nesnažte se o zcela originální vzezření vaší aplikace. Nedělejte nestandardní tlačítka, nabídky a další, pokud to není neskutečně nutné. Všimněte si, jak odporně to působí např. u Office XP ve Windows 2000 - jiné menu, jiná barva než je nastavená v systému. Může někdo soudný říct, že je to profesionální? Nedopouštějte se tedy zločinu na vašich uživatelích a snažte se, aby vaše aplikace byly použitelné.
Tento článek byl napsán pro časopis Softwarové noviny 2/2002.
Upozornění: tento text neprošel redakční úpravou, takže je tak, jak byl napsán včetně případných chyb. Žádná část tohoto článku nesmí být použita bez předchozího souhlasu autora.
Seznam mých dalších článků je v tomto přehledu.
| Čtenář |
| Vyhledávání |
|
|
| Kalendář |
| |||||||||||||||||||||||||||||||||||||||||||||||||
| Reklama |
|
|