phpRS            

Dnešní datum: 10. 09. 2010   | Hlavní stránka | Seznam rubrik | Kniha návštěv |  
  Hlavní menu
Hlavní stránka
Seznam rubrik
Fotogalerie
Kniha návštěv
Stáhněte si
Odkazy
Ankety
TOP 15

  Reklama


  Rubriky

  Poslouchám na síti


Spusť přehrávač


Spusť přehrávač


  Informace o webu
Všehochuť aneb od každého trochu

Content © 1991-2010 Slávek Rydval

View Slávek Rydval's profile on LinkedIn

Vytvořeno pomocí phpRS a Texy!

RSS kanál

Odborné články

* Jak navrhovat GUI v Delphi

Vydáno dne 08. 08. 2005 (3912 přečtení)

V Softwarových novinách 11/2001 jsem popsal pár základních pravidel o tvorbě uživatelského prostředí. V tomto díle ukáži, jak tato pravidla používat při vývoji aplikací v Delphi (a tedy i C++ Builderu - to, co bude napsáno, bude totiž platit pro obě prostředí). Tento text je určen hlavně pro začátečníky, kteří ještě ne zcela dokáží využít základních vlastností vývojového nástroje.

Ještě než začneme povídání o vlastním návrhu, zastavím se u centralizace akcí, která (nejen s grafickým návrhem) souvisí. Jistě jste si všimli, že velké množství aplikací dokáže jednu akci vyvolat několika způsoby - například ve Wordu otevření souboru: z menu Soubor, pomocí nástrojové lišty či pomocí klávesové zkratky (masochisté jistě najdou i další způsoby). Nebudeme si nalhávat, že napsat třikrát tentýž kód pro otevření souboru je ta nejlepší metoda. Naopak, cílem je napsat vše pouze jednou a následně toho bez výjimek využívat.

Od Delphi 5 existuje k tomu komponenta TActionList, ve které je možné definovat si tzv. akce (třída TAction), jež mají několik základních vlastností (jsou uvedeny v tabulce).

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;

ActionList

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ů.

Uživatelská nabídka

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.

Dialog

Dialog

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.

PhotoShop 6

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.

Ukončení Windows 2000

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).

Bublinková nápověda

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;

Místo závěru

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.




[Akt. známka: 0 / Počet hlasů: 0] 1 2 3 4 5

Celý článek | Autor: Slávek Rydval | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek

  Čtenář
Jméno:
Heslo:


Registrace | Info
Zapomenuté heslo

  Vyhledávání

Hledej
na Nawebce!


Rozšířené vyhledávání

  Kalendář
<<  Září  >>
PoÚtStČtSoNe
  1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30    

  Reklama


rkEdit především pro vývojáře
rkEdit především pro vývojáře