Zaujímavý

Dynamické vytváranie komponentov (za behu)

Dynamické vytváranie komponentov (za behu)



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Najčastejšie pri programovaní v Delphi nemusíte dynamicky vytvárať komponenty. Ak vynecháte komponent vo formulári, spoločnosť Delphi pri vytváraní formulára spracováva komponenty automaticky. Tento článok sa zaoberá správnym spôsobom, ako programovo vytvárať komponenty za behu.

Dynamické vytváranie komponentov

Existujú dva spôsoby, ako dynamicky vytvárať komponenty. Jedným zo spôsobov je urobiť z formulára (alebo nejakého iného komponentu TC) vlastníka nového komponentu. Toto je bežný postup pri zostavovaní zložených komponentov, kde vizuálny kontajner vytvára a vlastní čiastkové komponenty. Ak tak urobíte, zaistí sa, že novo vytvorený komponent bude zničený, keď bude zničený vlastniaci komponent.

Ak chcete vytvoriť inštanciu (objekt) triedy, zavolajte jej metódu „Create“. Konštruktor Create je metóda triedy, na rozdiel od prakticky všetkých ostatných metód, s ktorými sa stretnete pri programovaní Delphi, čo sú objektové metódy.

Napríklad komponent TCom deklaruje konštruktor Create takto:

konštruktor Create (vlastník: TComponent); virtual;

Dynamické vytváranie s vlastníkmi
Tu je príklad dynamického stvorenia sám je potomok TC komponent alebo TC komponent (napr. prípad TForm):

s TTimer.Create (Self) do
začať
Interval: = 1 000;
Povolené: = Nepravdivé;
OnTimer: = MyTimerEventHandler;
koniec;

Dynamické stvorenie s výslovným volaním zadarmo
Druhý spôsob vytvorenia komponentu je použitie nula ako majiteľ. Upozorňujeme, že ak to urobíte, musíte tiež výslovne uvoľniť objekt, ktorý vytvoríte, akonáhle ho už nepotrebujete (alebo budete mať k dispozícii únik pamäte). Tu je príklad použitia nuly ako vlastníka:

s TTable.Create (nula) urobiť
vyskúšať
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Otvorené;
editovať;
FieldByName ('Busy'). AsBoolean: = True;
post;
konečne
Zadarmo;
koniec;

Dynamické vytváranie a odkazy na objekty
Je možné vylepšiť dva predchádzajúce príklady priradením výsledku volania Create k premennej lokálnej k metóde alebo patriacej do triedy. Toto je často žiaduce, keď je potrebné použiť odkazy na komponent neskôr, alebo keď sa treba vyhnúť problémom s určovaním rozsahu potenciálne spôsobeným blokmi „With“. Tu je kód na vytvorenie TTimeru zhora, s použitím premennej poľa ako odkazu na inštanovaný objekt TTimer:

FTimer: = TTimer.Create (Self);
s FTimerom
začať
Interval: = 1 000;
Povolené: = Nepravdivé;
OnTimer: = MyInternalTimerEventHandler;
koniec;

V tomto príklade je "FTimer" súkromná premenná poľa formy alebo vizuálneho kontajnera (alebo čokoľvek, čo je "Self"). Pri prístupe k premennej FTimer z metód v tejto triede je veľmi dobré skontrolovať, či je odkaz platný pred použitím. Toto sa vykonáva pomocou funkcie Delphi's Assigned:

ak je priradený (FTimer), potom FTimer.Enabled: = True;

Dynamické vytváranie a odkazy na objekty bez vlastníkov
Variáciou je vytvoriť komponent bez vlastníka, ale zachovať referenciu pre neskoršie zničenie. Konštrukčný kód pre TTimer by vyzeral takto:

FTimer: = TTimer.Create (nula);
s FTimerom
začať

koniec;

A kód ničenia (pravdepodobne v deštruktore formulára) bude vyzerať asi takto:

FTimer.Free;
FTimer: = nula;
(*
Alebo použite postup FreeAndNil (FTimer), ktorý uvoľní odkaz na objekt a nahradí ho nulovým.
*)

Pri uvoľňovaní objektov je rozhodujúce nastavenie odkazu na nulu. Volanie na Free najskôr skontroluje, či je referencia objektu nulová alebo nie, a ak nie je, volá destruktor objektu.

Dynamické vytváranie a odkazy na lokálne objekty bez vlastníkov

Tu je kód na vytvorenie TTable zhora, s použitím lokálnej premennej ako odkazu na inštančný objekt TTable:

localTable: = TTable.Create (nula);
vyskúšať
s localTable do
začať
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
koniec;

// Neskôr, ak chceme explicitne uviesť rozsah:
localTable.Open;
localTable.Edit;
localTable.FieldByName ('Busy'). AsBoolean: = True;
localTable.Post;
konečne
localTable.Free;
localTable: = nil;
koniec;

Vo vyššie uvedenom príklade je „localTable“ lokálna premenná deklarovaná rovnakou metódou obsahujúcou tento kód. Všimnite si, že po uvoľnení akéhokoľvek objektu je vo všeobecnosti dobrý nápad nastaviť nulovú hodnotu.

Varovné slovo

DÔLEŽITÉ: Nemiešajte volanie zadarmo s odovzdaním platného vlastníka konštruktorovi. Všetky predchádzajúce techniky budú fungovať a sú platné, ale mali by nasledujúce nikdy sa v kóde nenachádzajú:

s TTable.Create (self) do
vyskúšať

konečne
Zadarmo;
koniec;

Príklad kódu uvedený vyššie predstavuje zbytočné zásahy do výkonu, mierne ovplyvňuje pamäť a má potenciál predstaviť ťažko nájdené chyby. Zistite prečo.

Poznámka: Ak dynamicky vytvorený komponent má vlastníka (špecifikovaný parametrom AOwner v konštruktore Create), potom je tento vlastník zodpovedný za zničenie komponentu. V opačnom prípade musíte výslovne zavolať bezplatne, keď už komponent nepotrebujete.

Článok pôvodne napísal Mark Miller

V Delphi bol vytvorený testovací program na časovanie dynamickej tvorby 1 000 komponentov s rôznym počiatočným počtom komponentov. Testovací program sa zobrazí v dolnej časti tejto stránky. Graf ukazuje súbor výsledkov testovacieho programu, porovnávajúci čas potrebný na vytvorenie komponentov s vlastníkmi aj bez nich. Upozorňujeme, že ide iba o časť zásahu. Pri likvidácii komponentov sa dá očakávať podobné oneskorenie výkonu. Čas na dynamické vytváranie komponentov s vlastníkmi je o 1200% až 107960% pomalší ako čas na vytvorenie komponentov bez vlastníkov v závislosti od počtu komponentov vo formulári a vytvorenej súčasti.

Testovací program

Varovanie: Tento testovací program nesleduje a neprodukuje komponenty, ktoré sú vytvorené bez vlastníkov. Nesledovaním a uvoľnením týchto komponentov časy namerané pre kód dynamickej tvorby presnejšie odrážajú reálny čas na dynamické vytvorenie komponentu.

Stiahnite si zdrojový kód

Výstraha!

Ak chcete dynamicky vytvoriť inštanciu Delphi komponenty a explicitne ju uvoľniť niekedy neskôr, vždy ju odovzdajte ako vlastníka. Ak tak neurobíte, môže to predstavovať zbytočné riziko, problémy s výkonom a údržbou kódu. Ak sa chcete dozvedieť viac, prečítajte si článok „Varovanie pred dynamicky sa rozvíjajúcimi komponentmi Delphi“.