Tipy a triky v Delphi, díl 161. - vylepšujeme vlastní komponenty

Diskuze čtenářů k článku

Tomas Jantac  |  03. 11. 2004 12:44

Dovoluji si upozornit na dve drobne chybicky v ukazkovem prikladu, ktere ovsem mohou nekterym ctenarum zamotat hlavu.
1) Pokud vytvarime novou tridu TMojeTlacitko vychazejici z tridy TButton, je nevhodne prepisovat konstruktor Create; Trida TButton vychazi z tridy TButtonControl a ta zase z TWinControl. TWinControl je zakladni tridou pro vsechny vizualni (VCL) komponenty a pouziva konstruktor Create(AOwner:TComponent). Pokud chceme aby nase komponenta pracovala spravne, tj. pri polozeni tlacitka na formular se provedly vsechny inicializacni kroky vsech predku a tim se zajistila spravna funkcnost tlacitka, musime prepsat tento konstruktor a volat v nem inherited.
2) Pri polozeni komponenty na formular (resp. pri jakemkoliv vytvareni instance komponenty, napr. pri vytvareni formulare ze souboru DFM) dochazi k volani constructoru na urovni TWinControl (Create(AOwner:TComponent);). Pokud tedy bude nas konstruktor napsan bez "magickeho" override, nedojde k prepsani puvodniho create(AOwner:TComponent) ve Virtual Method Table (VMT) a bude se v tom pripade volat jen puvodni kostruktor tridy TWinControl.
resp. budou se volat vsechny constructory Create(AOwner:create) ktere boudou prepisovat ve VMT tabulce "puvodni" constructor tridy TWincontrol (tj. vsichni primi potomci se zapisem Create(AOwner:TComponent); override;).
Tyto principy je nutne repektovat pouze v pripade ze rozsirujeme tlacitko o nejake dalsi funkce ktere si vyzaduji prvotni inicializaci (pokud budeme pouzivat nejake nove promenne, objekty, pamet, atd....).
Je take ale mozne, ze budeme chtit vytvorit zcela novy constructor pro vytvareni objektu napriklad nejakym scriptem a budeme chtit aby si komponenta (tlacitko) sama nastavila vsechny potrebne vlastnosti jenz ji predame pri volani tohoto noveho constructoru. Takovy constructor by vypadal pak treba takto:
constructor Create(AOwner:Tcomponent; Script:String);
begin
    Inherited Create(AOwner);
    Left:=GetLeftFromScriptString(Script);
     Top:=GetTopFromScriptString(Script);
end;
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  03. 11. 2004 12:58

Koukam ze byl nakonec kolega Zdenek rychlejsi. :o) Pokud nekdo nebude rozumet memu vykladu, at nezoufa a ridi se jeho radami.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zdenek  |  03. 11. 2004 12:17

Pokud pouzivate v textu clanku ilustracni priklady, pouzivejte je tak, jak odpovidaji praxi!
Nasledujici prikaz skonci chybou,
  MojeTlacitko := TButton.Create;
protoze konstruktor tridy TButton je deklarovan jako Create(AOwner : TComponent).
Konstrukce
type
  TNaseTlacitko = class(TButton)
 
public
    { Public declarations }
    constructor Create;
  end;

navic postrada direktivu override za deklaraci konstruktoru, cimz dojde ke skryti a prepsani puvodniho konstruktoru predka TButton. Spravne je az deklarace destruktoru.
Z takoveho clanku musi byt mene zkuseny ctenar nutne zmateny. 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zdenek  |  03. 11. 2004 12:16

Pokud pouzivate v textu clanku ilustracni priklady, pouzivejte je tak, jak odpovidaji praxi!
Nasledujici prikaz skonci chybou,
  MojeTlacitko := TButton.Create;
protoze konstruktor tridy TButton je deklarovan jako Create(AOwner : TComponent).
Konstrukce
type
  TNaseTlacitko = class(TButton)
 
public
    { Public declarations }
    constructor Create;
  end;

navic postrada direktivu override za deklaraci konstruktoru, cimz dojde ke skryti a prepsani puvodniho konstruktoru predka TButton. Spravne je az deklarace destruktoru.
Z takoveho clanku musi byt mene zkuseny ctenar nutne zmateny. 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zdenek  |  03. 11. 2004 12:16

Pokud pouzivate v textu clanku ilustracni priklady, pouzivejte je tak, jak odpovidaji praxi!
Nasledujici prikaz skonci chybou,
  MojeTlacitko := TButton.Create;
protoze konstruktor tridy TButton je deklarovan jako Create(AOwner : TComponent).
Konstrukce
type
  TNaseTlacitko = class(TButton)
 
public
    { Public declarations }
    constructor Create;
  end;

navic postrada direktivu override za deklaraci konstruktoru, cimz dojde ke skryti a prepsani puvodniho konstruktoru predka TButton. Spravne je az deklarace destruktoru.
Z takoveho clanku musi byt mene zkuseny ctenar nutne zmateny. 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor