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
Hromadné enablování a disablování komponent
19. října 2001, 00.00 | I na tomto zdálnivě triviálním tématu se dají najít místa, kde lze něco vylepšit.
Na úvod článku bych se chtěl omluvit za používání anglicko-českých odvozenin slov enable a disable. Nedělám to rád (taky mě to "tahá za uši") a jediným důvodem, proč je v následujícím textu několikrát spatříte, je, že jsem nenašel dostatečně přiléhavý český ekvivalent. Pokud máte pocit, že jste na tom se slovní zásobou lépe než já (tzn. dostatečně přiléhavý ekvivalent jste našli), kamenujte mě v diskuzi pod článkem :-)
ProblémEnablování a disablování vizuálních komponent je při tvorbě GUI častou potřebou programátora. V Delphi se k tomuto účelu používá vlastnost Enabled, kterou má každá komponenta odvozená od třídy TControl. Bohužel při častém používání této vlastnosti vyplují na povrch dvě věci:
- Vlastnost Enabled neovlivňuje barvu dotyčné komponenty. Z hlediska konzistence je lepší, aby se barva komponenty (např. TEditu) při disablování změnila na šedou (přesněji systémovou clBtnFace) a při enablování zpět na bílou (resp. clWindow).
- Dost často je potřeba "hýbat" s několika komponentami najednou. To ve spojitosti s bodem 1 vede ke dlouhým "nudlím" kódu, jejichž jediným úkolem je enablovat a disablovat jednotlivé editboxy, seznamy a tlačítka. Uvažte, co práce dá například obsluha události OnClick na volbě "používat autorizaci" na následujícím formuláři:
Řešení
Je jasné, že nastíněná situace si přímo říká o zjednodušení. Jak to provést? Následující dvě procedury jsou vhodným kandidátem:
|
První z procedur umí disablovat (ale "opravdu", i se zašeděním) komponenty několika typů. Komponentu, kterou chceme disablovat, jí předáme jako parametr. Procedura nastaví vlastnost Enabled na False a poté zjistí, jakého typu komponenta je a po přetypování nastaví správně vlastnost Color. (Přetypování a selekce typu jsou nutné, protože vlastnost Color není definována na úrovni TControl.) Zde máte, vážení čtenáři, prostor pro rozšíření na libovolný typ komponenty, který potřebujete - stačí doplnit příslušnou podmínku.
Druhá procedura - o mnoho užitečnější než první - provede tutéž akci pro celé pole komponent odvozených od TControl. Toto pole postupně v cyklu projde a na každou položku "aplikuje" proceduru Disable.
Obdobně není problém stvořit procedury Enable a EnableControls; ty ale pro ušetření místa nebudu vypisovat (stvořit si je "svépomocí" z procedur výše uvedených je otázka minuty).
S použitím popsaných procedur se kód nutný k obsluze události OnClick u volby "používat autorizaci" v dialogu na obrázku nahoře redukuje z několika desítek na pět řádků:
|
Poznámka závěrem
Zkušenější čtenáře možná napadlo, že celý postup změny vlastnosti Color komponenty by šel řešit pomocí mechanismu RTTI (Run-Time Type Information), čímž by dalo obejít zdlouhavé kontrolování typů. To je pravda, výsledné řešení by bylo o něco elegantnější., ale nejspíš také pomalejší. Každopádně pokud bude zájem (podpořený dostatečným ohlasem v diskuzi), můžu tomuto tématu věnovat některý z dalších článků.
-
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