Hromadné enablování a disablování komponent - 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

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ém

Enablová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:

  1. 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).
  2. 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:

procedure Disable(Control: TControl);
begin
  Control.Enabled := False;

  if Control is TEdit then
   TEdit(Control).Color := clBtnFace;
  if Control is TListBox then
    TCombobox(Control).Color := clBtnFace;
  if Control is TMemo then
    TMemo(Control).Color := clBtnFace;
  ...
end;

procedure DisableControls(Controls: array of TControl);
var
  I: Integer;
begin
  for I := Low(Controls) to High(Controls) do
    Disable(Controls[I]);
end;

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

if (UseAutorisationRadio.Checked) then
  EnableControls([NameLabel, NameEdit, PassLabel,
    PassEdit, RememberCheck, OptionsBtn])
else
  DisableControls([NameLabel, NameEdit, PassLabel,
    PassEdit, RememberCheck, OptionsBtn]);

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

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: