Delphi komponentu izveidošana dinamiski (izpildes laikā)

Visbiežāk, programmējot Delphi, jums nav dinamiski jāizveido komponents. Ja nometat komponentu veidlapā, Delphi automātiski apstrādā komponentu izveidi, kad veidlapa tiek izveidota. Šajā rakstā ir aprakstīts pareizais veids, kā programmatiski izveidot komponentus izpildes laikā.

Dinamiska komponentu izveidošana

Ir divi veidi, kā dinamiski izveidot komponentus. Viens veids ir padarīt veidlapu (vai kādu citu TComponent) par jaunā komponenta īpašnieku. Tā ir ierasta prakse, veidojot kompozītmateriāla komponentus, kur vizuālais konteiners izveido un pieder apakškomponentiem. To darot, tiks nodrošināts, ka jaunizveidotais komponents tiek iznīcināts, iznīcinot īpašumtiesības.

Lai izveidotu klases instanci (objektu), jūs to saucat par “Izveidot” metodi. Izveidot konstruktoru ir a klases metode, pretstatā praktiski visām citām metodēm, ar kurām jūs sastapsities Delphi programmēšanā, kas ir objekta metodes.

Piemēram, TComponent deklarē Izveidot konstruktoru šādi:

konstruktors Izveidot (AOwner: TComponent); virtuāls;

instagram viewer

Dinamiska izveidošana ar īpašniekiem
Šeit ir dinamiskas radīšanas piemērs Es pats ir TComponent vai TComponent pēcnācējs (piemēram, TForm piemērs):

ar TTimer. Izveidojiet (pats) dariet
sākt
Intervāls: = 1000;
Iespējots: = Nepatiess;
OnTimer: = MyTimerEventHandler;
beigas;

Dinamiska izveidošana ar skaidru aicinājumu uz bezmaksas
Otrais komponenta izveidošanas veids ir izmantošana nulle kā īpašnieks. Ņemiet vērā: ja jūs to darāt, jums arī ir skaidri jāatbrīvo jūsu izveidotais objekts, tiklīdz tas jums vairs nav nepieciešams (vai arī jūs ražosit atmiņas noplūde). Šeit ir piemērs, kā nulli var izmantot kā īpašnieku:

ar TT. Izveidot (nulle) darīt
mēģiniet
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Atvērts;
Rediģēt;
FieldByName ('Aizņemts'). AsBoolean: = True;
Pasts;
beidzot
Bezmaksas;
beigas;

Dinamiska izveide un objekta atsauces
Divus iepriekšējos piemērus ir iespējams uzlabot, piešķirot Izsaukuma rezultātu mainīgajam vietējam mainīgajam metodei vai piederībai klasei. Tas bieži vien ir vēlams, atsaucoties uz komponents jālieto vēlāk vai kad apjoma noteikšana Jāizvairās no problēmām, kuras potenciāli var izraisīt bloki "Ar". Šeit parādīts TTimera izveides kods no augšas, izmantojot lauka mainīgo kā atsauci uz paātrināto TTimera objektu:

FTimer: = TTimer. Izveidot (sevi);
ar FTimer darīt
sākt
Intervāls: = 1000;
Iespējots: = Nepatiess;
OnTimer: = MyInternalTimerEventHandler;
beigas;

Šajā piemērā "FTimer" ir formas vai vizuālā konteinera (vai neatkarīgi no tā, kas ir "Self") privāta lauka mainīgais. Piekļūstot mainīgajam FTimer no šīs klases metodēm, pirms tās izmantošanas ir ļoti ieteicams pārbaudīt, vai atsauce ir derīga. Tas tiek darīts, izmantojot funkciju Delfiem piešķirta:

ja Piešķirts (FTimer), tad FTimer. Iespējots: = Patiess;

Dinamiska izveide un objektu atsauces bez īpašniekiem
Variants ir izveidot komponentu bez īpašnieka, bet saglabāt atsauci vēlākai iznīcināšanai. TTimera konstrukcijas kods izskatās šādi:

FTimer: = TTimer. Izveidot (nulle);
ar FTimer darīt
sākt
...
beigas;

Un iznīcināšanas kods (domājams, formas iznīcinātājā) izskatās apmēram šādi:

FTimers. Bezmaksas;
FTimer: = nulle;
(*
Vai arī izmantojiet FreeAndNil (FTimer) procedūru, kas atbrīvo objekta atsauci un aizstāj atsauci ar nulli.
*)

Objekta atsauces iestatīšana uz nulli ir kritiska, atbrīvojot objektus. Zvans uz Bezmaksas vispirms pārbauda, ​​vai objekta atsauce ir nulle vai nē, un, ja tā nav, tas izsauc objekta iznīcinātāju.

Dinamiska izveidošana un lokālu objektu atsauces bez īpašniekiem

Šeit ir redzams TTable izveidošanas kods no augšas, izmantojot lokālo mainīgo kā atsauci uz pagatavoto TTable objektu:

localTable: = TTable. Izveidot (nulle);
mēģiniet
ar localTable darīt
sākt
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
beigas;
...
// Vēlāk, ja mēs vēlamies precīzi norādīt darbības jomu:
localTable. Atvērts;
localTable. Rediģēt;
localTable. FieldByName ('Aizņemts'). AsBoolean: = True;
localTable. Pasts;
beidzot
localTable. Bezmaksas;
localTable: = nulle;
beigas;

Iepriekš minētajā piemērā “localTable” ir a vietējais mainīgais deklarēti tajā pašā metodē, kurā ir šis kods. Ņemiet vērā, ka pēc jebkura objekta atbrīvošanas parasti ir ļoti laba ideja iestatīt atsauci uz nulli.

Brīdinājuma vārds

SVARĪGI: nejauciet zvanu uz Bezmaksas un derīga īpašnieka nodošanu celtniekam. Visi iepriekšējie paņēmieni darbosies un ir derīgi, taču šādiem vajadzētu būt nekad neatrodas jūsu kodā:

ar TT. Izveidojiet (pats) dariet
mēģiniet
...
beidzot
Bezmaksas;
beigas;

Iepriekš minētais koda piemērs iepazīstina ar nevajadzīgiem veiktspējas trāpījumiem, nedaudz ietekmē atmiņu, un tam ir potenciāls ieviest grūti atrodamas kļūdas. Uzziniet, kāpēc.

Piezīme: ja dinamiski izveidotajam komponentam ir īpašnieks (kuru norāda konstruktora izveides parametrs AOwner), tad šī komponenta iznīcināšana ir atbildīga par šo īpašnieku. Pretējā gadījumā jums ir skaidri jāizsauc Bezmaksas, kad komponents jums vairs nav nepieciešams.

Rakstu sākotnēji raksta Marks Millers

Delfos tika izveidota testa programma, lai laiku pa laikam izveidotu 1000 komponentus ar mainīgu sākotnējo komponentu skaitu. Pārbaudes programma parādās šīs lapas apakšā. Diagramma parāda testa programmas rezultātu kopumu, salīdzinot laiku, kas nepieciešams komponentu izveidošanai gan ar īpašniekiem, gan bez tiem. Ņemiet vērā, ka šī ir tikai daļa no trāpījuma. Iznīcinot komponentus, var sagaidīt līdzīgu veiktspējas kavēšanos. Laiks, lai dinamiski izveidotu komponentus kopā ar īpašniekiem, ir par 1200% līdz 107960% lēnāks nekā izveidošanas laiks sastāvdaļas bez īpašniekiem, atkarībā no veidlapā esošo sastāvdaļu skaita un esošās sastāvdaļas izveidots.

Pārbaudes programma

Brīdinājums: Šī testa programma neizseko un neatbrīvo komponentus, kas izveidoti bez īpašniekiem. Neizsekojot un neatbrīvojot šos komponentus, dinamiskā izveides koda izmērītie laiki precīzāk atspoguļo reālo laiku, lai dinamiski izveidotu komponentu.

Lejupielādējiet avota kodu

Brīdinājums!

Ja vēlaties dinamiski paātrināt Delphi komponentu un skaidri to atbrīvot kaut kad vēlāk, vienmēr nododat nulli kā īpašnieku. To nedarot, var rasties nevajadzīgs risks, kā arī veiktspējas un koda uzturēšanas problēmas. Lai uzzinātu vairāk, izlasiet rakstu "Brīdinājums par Delphi komponentu dinamisku aktivizēšanu".

instagram story viewer