Sem tam se ke mně dostane na posouzení nějaký kód a v mnoha případech jsem překvapen, proč si autor trochu neusnadní práci. Konkrétně třeba za pomocí komponenty ActionList.
Tato komponenta byla přidána v Delphi 5 (pokud se nepletu - resp. tam už určitě existuje) a jejím cílem bylo usnadnit obsluhu stejné akce z více míst. Určitě mi rozumíte: máte např. v programu otevřít soubor, jenže jednou je to z hlavního menu, podruhé z toolbaru, potřetí z popup menu a čert ví kde ještě.
Jasně, člověk může mít pro všechny možnosti společnou obsluhu, ale to je jen poloviční řešení problému. Důležité je třeba zakazování komponent, konsistentní popisky nebo hinty, a o ikonách ani nemluvě. Člověk aby si na všechno myslel. A přitom se to dá hodně z toho relativně jednoduše řešit za pomocí komponenty ActionList.
ActionList ve starších Delphi
Editor se spustí poklepáním na ikonu ActionListu. ActionList je v podstatě seznam akcí (následník TAction - např. otevření souboru, spuštění tisku, atd.). U každé akce se dají definovat vlastnosti, které jsou následně přebrány komponentou, která akci bude používat (např. Caption, IconIndex, Hint, Checked …).
Definice akce
Dále je zde několik událostí z nichž klíčová je OnExecute, což je událost, která bude zavolána při spuštění akce (kliknutí na tlačítko, vybrání položky menu atd.).
- Vždy definujte tuto událost a ne událost na komponentě, která akci používá. V opačném případě by totiž u ostatních komponent používajících tuto akci nedošlo k zavolání - bylo by to jen např. pro to menu.
- pokud nebude akce mít tuto obsluhu, bude Disabled - upozorňuji na to rovnou
Pokud nastavíte akci Visible nebo Enabled, resp. jakoukoliv vlastnost, promítne se změna do všech komponent používajících tuto akci. Tj. pokud chcete zakázat všude otevření souboru tak jednoduše zakážete příslušnou akci, žádné chuchvalce kódu s Enabled := False, prostě jen jeden řádek.
Kromě jiného i ActionList má určité události, např. OnUpdate - je vyvolána v případě kdy je třeba aktualizovat stav komponent (tj. celkem často), zvažte zda to obsloužíte, nebo budete povolovat stav manuálně.
Na prvním obrázku lze vidět kategorie. Jedná se čistě o nevizuální začlenění vašich akcí do kategorií. Slouží to jen Vám (pokud se nepletu). Kategorie definujete tak, že u libovolné TAction napíšete (později vyberete ze seznamu) property Category - viz. druhý obrázek - a IDE hned přesune akci do kategorie (pokud neexistuje, tak ji vytvoří).
Pokud máme nyní vytvořen seznam akcí (samozřejmě ho můžeme doplňovat), přistoupíme k napojení na komponenty. Např. otevřeme editor menu a jen vybereme položku a nastavíme u ní příslušnou akci. Nic víc, resp. maximálně budeme muset vybrat jméno nové komponenty pokud nepoužíváme CnWizards, který by nám ho inteligentně předgeneroval.
Malá odbočka: pokud si zvolím pro akci prefix např. actXXXX, pro tlačítko btnXXX, položky menu např. miXXX, tak mi CnWizards automaticky např. pro akci actFileOpen vygeneruje btnFileOpen nebo miFileOpen a mám v tom pořádek, ale je to každého osobní věc.
Propojení např. s položkou menu
Vybráním akce se vyplní položky, které jsou společné, včetně obsluhy pro spuštění. Pokud např. ale chceme mít jinou ikonu (např. v toolbaru), můžeme nyní změnit IconIndex a změna bude jen pro ikonu v toolbaru (dokud neprovedeme změnu původní akce, ta pak přerazí námi definované změny). Ještě jednou upozorním, že propojení mezi akcí a komponentou je dynamické - tj. veškeré změny v akci se promítnou do komponenty (např. změna Caption nebo uvedeného indexu ikony).
Kromě Vámi definovaných akcí jsou k dispozici tzn. standardní akce. Vkládají se v editoru přes první ikonu v toolbaru (resp. rozbalením jejího tlačítka).