Class helper

vložil Radek Červinka 15. února 2010 23:07

Jak jsem již psal, Delphi 2007 přináší do jazyka koncepci Class Helper. Jedná se o možnost rozšiřovat existující třídy o metody a property (ale ne pole) bez zásahu do původní třídy. Cílem je mít možnost základní třídy a případné platformové rozšíření implementovat pomocí class helperů.

Raději rovnou příklad. Vytvoříme class helper pro TEdit a pak ho použijeme.

    1unit uEditHelper;
    2// class helper pro TEdit
    3interface
    4uses
    5  StdCtrls;
    6type
    7  TEditHelper = class helper for TEdit // deklarace
    8  private
    9    function miGetIntValue: Integer;  // metoda pro property
   10  published
   11    function CheckForInt: Boolean;  // přidáme metodu na validaci
   12    property IntValue:Integer read miGetIntValue; // a property
   13  end;
   14
   15
   16implementation
   17uses
   18  SysUtils;
   19
   20function TEditHelper.CheckForInt: Boolean;
   21var
   22  iValue:Integer;
   23begin
   24  Result := TryStrToInt(Text, iValue);
   25end;
   26
   27function TEditHelper.miGetIntValue: Integer;
   28begin
   29  Result := StrToInt(Text);
   30end;
   31end.

Nyní máme tedy class helper a snad tam není nic komplikovaného. Jak ho ale použijeme? Použití class helperů je možné v rámci viditelnosti. Tedy v místě, kde chceme používat naše rozšíření na ně musíme "vidět", tj. musí být v uses.

Mějme klasický formulář s jedním tlačítkem (TButton) a jedním editačním polem (TEdit), do uses dáme náš class helper a dopíšeme obsluhu OnClick tlačítka dle uvedeného kódu:

    1var
    2  Form1: TForm1;
    3
    4implementation
    5uses
    6  uEditHelper;
    7{$R *.dfm}
    8
    9procedure TForm1.Button1Click(Sender: TObject);
   10var
   11  i:Integer;
   12begin
   13  if not Edit1.CheckForInt then
   14    ShowMessage(Format('Neplatná hodnota [%s]', [Edit1.Text]));
   15  i := Edit1.IntValue;
   16end;

Pokud by nebyl class helper (uEditHelper) v uses tak by náš kód nešel přeložit. Volání helperu je celkem přímočaré, prostě nad editačním polem zavoláme metodu helperu, případně použijeme property v něm definovanou.

Znovu opakuji, že nelze přidávat žádné pole (tj. žádné proměnné třídy), tj. musíte operovat nad existujícími daty.

Jen pro zajímavost ukáži jak vypadá výsledný kód. Je evidentní, že použití class helperů nemá žádnou režii ohledně volání:

Unit1.pas.32: if not Edit1.CheckForInt then
0045DA97 8B8364030000     mov eax,[ebx+$00000364]
0045DA9D E876FDFFFF       call TEditHelper.CheckForInt
0045DAA2 84C0             test al,al
0045DAA4 7533             jnz $0045dad9
Unit1.pas.33: ShowMessage(Format('Neplatná hodnota [%s]', [Edit1.Text]));
0045DAA6 8D45FC           lea eax,[ebp-$04]
0045DAA9 50               push eax
0045DAAA 8D55F0           lea edx,[ebp-$10]
0045DAAD 8B8364030000     mov eax,[ebx+$00000364]
0045DAB3 E8A0F4FDFF       call TControl.GetText
0045DAB8 8B45F0           mov eax,[ebp-$10]
0045DABB 8945F4           mov [ebp-$0c],eax
0045DABE C645F80B         mov byte ptr [ebp-$08],$0b
0045DAC2 8D55F4           lea edx,[ebp-$0c]
0045DAC5 33C9             xor ecx,ecx
0045DAC7 B818DB4500       mov eax,$0045db18
0045DACC E813BAFAFF       call Format
0045DAD1 8B45FC           mov eax,[ebp-$04]
0045DAD4 E8530DFDFF       call ShowMessage
Unit1.pas.34: i := Edit1.IntValue;
0045DAD9 8B8364030000     mov eax,[ebx+$00000364]
0045DADF E88CFDFFFF       call TEditHelper.miGetIntValue
Unit1.pas.36: end;
0045DAE4 33C0             xor eax,eax


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: ,

Jazyk

Komentáře

4.8.2011 12:42:44 #

JaroB

Jen poznámka, class helper jsem prakticky využil už v Delphi 2005.

JaroB

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS