Dinamično ustvarjanje komponent Delphi (med izvajanjem)

Najpogosteje pri programiranju v Delphiju ni treba dinamično ustvarjati komponente. Če spustite komponento na obrazec, Delphi sam ustvarja ustvarjanje komponente, ko je obrazec ustvarjen. Ta članek bo obravnaval pravilen način programskega ustvarjanja komponent med izvajanjem.

Ustvarjanje dinamičnih komponent

Obstajata dva načina za dinamično ustvarjanje komponent. Eden od načinov je, da naredite obrazec (ali kakšen drug TComponent) lastnika nove komponente. To je običajna praksa pri gradnji sestavljenih komponent, kjer vizualni vsebnik ustvarja in je lastnik podkomponent. S tem boste zagotovili, da se novo ustvarjena komponenta uniči, ko je uničena lastniška komponenta.

Če želite ustvariti primerek (predmet) razreda, pokličete njegovo metodo "Ustvari". Konstruktor Ustvari je razredna metoda, v nasprotju s skoraj vsemi drugimi metodami, ki jih boste srečali pri programiranju Delphija, ki so predmetne metode.

TComponent na primer izjavi konstruktor Create kot sledi:

konstruktor Ustvari (AOwner: TComponent); virtualni;

instagram viewer

Dinamično ustvarjanje z lastniki
Tu je primer dinamičnega ustvarjanja, kje Jaz je potomka TComponent ali TComponent (npr. primerek TForm):

s TTimer. Ustvari (samo) naredi
začeti
Interval: = 1000;
Omogočeno: = napačno;
OnTimer: = MyTimerEventHandler;
konec;

Dinamično ustvarjanje z izrecnim pozivom k brezplačnosti
Drugi način ustvarjanja komponente je uporaba nič kot lastnik. Upoštevajte, da če to storite, morate izrecno osvoboditi tudi objekt, ki ga ustvarite, takoj ko ga ne potrebujete več (ali boste ustvarili puščanje spomina). Tu je primer uporabe ničle kot lastnika:

s TTable. Ustvari (nič) narediti
poskusi
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Odprto;
Uredi;
FieldByName ('zaseden'). AsBoolean: = Res;
Objava;
končno
Prost;
konec;

Dinamično ustvarjanje in reference predmetov
Dva prejšnja primera je mogoče izboljšati tako, da rezultat klica Ustvari spremenljivki, ki je lokalna metodi ali pripada razredu. To je pogosto zaželeno, kadar se sklicujejo na sestavni del jih je treba uporabiti pozneje ali kdaj zajemanje težavam, ki jih potencialno povzročajo bloki "With", se je treba izogibati. Tu je koda za ustvarjanje TTimer od zgoraj, pri čemer uporablja spremenljivka polja kot sklic na uveljavljen objekt TTimer:

FTimer: = TTimer. Ustvari (Self);
s FTimer do
začeti
Interval: = 1000;
Omogočeno: = napačno;
OnTimer: = MyInternalTimerEventHandler;
konec;

V tem primeru je "FTimer" zasebna polja spremenljivka obrazca ali vizualni vsebnik (ali karkoli "Self"). Ko dostopate do spremenljivke FTimer iz metod v tem razredu, je zelo dobra ideja, da preverite, ali je referenca veljavna, preden jo uporabite. To se naredi z dodeljeno funkcijo Delphi:

če je dodeljen (FTimer), potem FTimer. Omogočeno: = Res;

Dinamično ustvarjanje in reference predmetov brez lastnikov
Razlika pri tem je ustvariti komponento brez lastnika, vendar ohraniti referenco za kasnejše uničenje. Gradbena koda za TTimer bi izgledala tako:

FTimer: = TTimer. Ustvari (nič);
s FTimer do
začeti
...
konec;

In koda uničenja (verjetno v destruktorju obrazca) bi izgledala nekako takole:

FTimer. Prost;
FTimer: = nič;
(*
Ali uporabite postopek FreeAndNil (FTimer), ki sprosti referenco na predmet in nadomesti referenco z nič.
*)

Pri sproščanju predmetov je ključnega pomena nastavitev sklicevanja na nič. Klic na Free najprej preveri, ali je referenca predmeta nična, če pa ni, pokliče uničevalnik predmeta Destroy.

Dinamično ustvarjanje in sklici na lokalne predmete brez lastnikov

Tukaj je zgornja koda ustvarjanja TTable z uporabo lokalne spremenljivke kot sklicevanja na uveljavljen objekt TTable:

localTable: = TTable. Ustvari (nič);
poskusi
z storitvijo localTable
začeti
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
konec;
...
// Kasneje, če želimo izrecno določiti obseg:
localTable. Odprto;
localTable. Uredi;
localTable. FieldByName ('zaseden'). AsBoolean: = Res;
localTable. Objava;
končno
localTable. Prost;
localTable: = nič;
konec;

V zgornjem primeru je "localTable" a lokalna spremenljivka deklarirano na isti način, ki vsebuje to kodo Po sprostitvi katerega koli predmeta je na splošno zelo dobra ideja, da se sklic postavi na nič.

Beseda opozorila

POMEMBNO: Ne mešajte klica na Brezplačno s posredovanjem veljavnega lastnika konstruktorju. Vse prejšnje tehnike bodo delovale in so veljavne, vendar bi morale biti naslednje se nikoli ne pojavijo v kodi:

s TTable. Ustvari (samo) naredi
poskusi
...
končno
Prost;
konec;

Zgornji primer kode uvaja nepotrebne rezultate uspešnosti, nekoliko vpliva na pomnilnik in ima možnost, da bi težko našel napake. Ugotovite, zakaj.

Opomba: Če ima dinamično ustvarjena komponenta lastnika (določeno s parametrom AOwner konstruktorja Create), potem je ta lastnik odgovoren za uničenje komponente. V nasprotnem primeru morate izrecno poklicati Brezplačno, ko komponente ne potrebujete več.

Članek prvotno napisal Mark Miller

V Delfih je bil ustvarjen testni program, s katerim je bilo mogoče dinamično ustvariti 1000 komponent z različnimi začetnimi števili komponent. Testni program se prikaže na dnu te strani. Tabela prikazuje niz rezultatov testnega programa in primerja čas, potreben za ustvarjanje komponent tako z lastniki kot brez njih. Upoštevajte, da je to le del zadetka. Podobno zamudo zmogljivosti lahko pričakujemo pri uničevanju komponent. Čas za dinamično ustvarjanje komponent z lastniki je 1200% do 107960% počasnejši kot čas za ustvarjanje komponente brez lastnikov, odvisno od števila komponent v obrazcu in sestavnih delov ustvaril.

Testni program

Opozorilo: Ta testni program ne sledi in brezplačnih komponent, ki so ustvarjene brez lastnikov. Če ne sledite in ne sprostite teh komponent, čas, izmerjen za dinamično kodo ustvarjanja, natančneje odraža realni čas za dinamično ustvarjanje komponente.

Prenesite izvorno kodo

Opozorilo!

Če želite dinamično sprožiti komponento Delphi in jo izrecno osvoboditi pozneje, vedno pošljite nič kot lastnika. Če tega ne storite, lahko povzročite nepotrebno tveganje, pa tudi težave z zmogljivostjo in vzdrževanjem kode. Če želite izvedeti več, preberite članek "Opozorilo o dinamično dodajanju komponent Delphi".

instagram story viewer