„Delphi“ komponentų kūrimas dinamiškai (vykdymo metu)

Dažniausiai programaujant „Delphi“ nereikia dinamiškai kurti komponento. Jei numesite komponentą formoje, „Delphi“ automatiškai tvarkys komponento kūrimą, kai forma bus sukurta. Šis straipsnis apims teisingą būdą, kaip programiškai kurti komponentus vykdymo metu.

Dinaminis komponentų kūrimas

Yra du būdai, kaip dinamiškai kurti komponentus. Vienas iš būdų yra padaryti formą (ar kitą „TComponent“) naujo komponento savininku. Tai yra įprasta praktika statant sudėtinius komponentus, kur vaizdinis konteineris sukuria ir jam priklauso. Tai atlikus bus užtikrinta, kad naujai sukurtas komponentas bus sunaikintas, kai sunaikinamas turimas komponentas.

Norėdami sukurti klasės egzempliorių (objektą), vadinate jo metodą „Kurti“. Sukurti konstruktorių yra klasės metodas, priešingai nei praktiškai visi kiti metodai, su kuriais susidursite programuodami „Delphi“, kurie yra objektų metodai.

Pavyzdžiui, „TComponent“ deklaruoja „Sukurti konstruktorių“ taip:

konstruktorius Kurti (savininkas: TComponent); virtualus;

instagram viewer

Dinamiškas kūrimas su savininkais
Čia yra dinaminio kūrimo pavyzdys Savarankiškai yra TComponent arba TComponent palikuonys (pvz., TForm pavyzdys):

su TTimeriu. Kurti (savarankiškai) daryti
prasideda
Intervalas: = 1000;
Įgalinta: = Netiesa;
„OnTimer“: = „MyTimerEventHandler“;
galas;

Dinaminis kūrimas su aiškiu raginimu nemokamai
Antrasis komponentų kūrimo būdas yra naudojimas nulis kaip savininkas. Atminkite, kad jei tai padarysite, taip pat turite aiškiai išlaisvinti sukurtą objektą, kai tik jums jo nebereikės (arba sukursite atminties nutekėjimas). Štai nulio kaip savininko naudojimo pavyzdys:

su TTable. Sukurti (nulį) padaryti
bandyti
„DataBaseName“: = „MyAlias“;
TableName: = 'MyTable';
Atviras;
Redaguoti;
„FieldByName“ („Užimta“). „AsBoolean“: = Tiesa;
Paštu;
pagaliau
Laisvas;
galas;

Dinaminis kūrimas ir objekto nuorodos
Galima patobulinti du ankstesnius pavyzdžius, kvietimo sukurti rezultatą priskiriant kintamajam, lokaliam pagal metodą arba priklausančiam klasei. Tai dažnai pageidautina, kai nuorodos į komponentas reikia naudoti vėliau arba kada apimties nustatymas Reikia vengti problemų, kurias gali sukelti blokai „Su“. Štai TTimerio sukūrimo kodas iš viršaus, naudojant lauko kintamąjį kaip nuorodą į pagreitintą TTimerio objektą:

FTimer: = TTimer. Kurti (save);
su FTimer padaryti
prasideda
Intervalas: = 1000;
Įgalinta: = Netiesa;
„OnTimer“: = „MyInternalTimerEventHandler“;
galas;

Šiame pavyzdyje „FTimer“ yra formos ar vizualinio rodinio (arba bet kokio „savęs“) privataus lauko kintamasis. Prieinant FTimer kintamąjį naudojant šios klasės metodus, prieš naudodamiesi įsitikinkite, ar nuoroda yra teisinga. Tai atliekama naudojant „Delphi“ priskirtą funkciją:

jei priskirtas (FTimer), tada FTimer. Įgalinta: = Tiesa;

Dinaminis kūrimas ir objekto nuorodos be savininkų
Šis variantas yra tai, kad kuriate komponentą be savininko, tačiau išlaikote nuorodą vėliau sunaikinti. TTimerio konstrukcijos kodas atrodytų taip:

FTimer: = TTimer. Sukurti (nulis);
su FTimer padaryti
prasideda
...
galas;

Naikinimo kodas (greičiausiai formos sunaikintojas) atrodytų maždaug taip:

FTimer. Laisvas;
FTimer: = nulis;
(*
Arba naudokite „FreeAndNil“ (FTimer) procedūrą, kuri išlaisvina objekto nuorodą ir pakeičia nuorodą nuliu.
*)

Atlaisvinant objektus labai svarbu nustatyti objekto nuorodą į nulį. Skambinimas į „Free“ pirmiausia patikrina, ar objekto nuoroda yra nulinė, ar ne, o jei nėra, skambina objekto naikintojui „Destroy“.

Dinaminis kūrimas ir vietinių objektų nuorodos be savininkų

Štai „TTable“ kūrimo kodas iš viršaus, naudojant vietinį kintamąjį kaip nuorodą į realizuojamą „TTable“ objektą:

localTable: = TTable. Sukurti (nulis);
bandyti
su „localTable do“
prasideda
„DataBaseName“: = „MyAlias“;
TableName: = 'MyTable';
galas;
...
// Vėliau, jei norime aiškiai apibrėžti taikymo sritį:
vietinis stalas. Atviras;
vietinis stalas. Redaguoti;
vietinis stalas. „FieldByName“ („Užimta“). „AsBoolean“: = Tiesa;
vietinis stalas. Paštu;
pagaliau
vietinis stalas. Laisvas;
„localTable“: = nulis;
galas;

Aukščiau pateiktame pavyzdyje „localTable“ yra a vietinis kintamasis deklaruojamas tuo pačiu metodu, kuriame yra šis kodas. Atminkite, kad atleidus bet kurį objektą, apskritai yra labai gera idėja nustatyti nulį.

Įspėjamasis žodis

SVARBU: nemaišykite skambučio į „Free“ su galiojančio savininko perdavimu statytojui. Visi ankstesni metodai veiks ir bus galiojantys, tačiau šie turėtų būti niekada neatsiras jūsų kode:

su TTable. Kurkite (darykite) patys
bandyti
...
pagaliau
Laisvas;
galas;

Aukščiau pateiktame kodo pavyzdyje pateikiami nereikalingi našumo įvykiai, jis šiek tiek paveikia atmintį ir gali pateikti sunkiai surandamas klaidas. Sužinok kodėl.

Pastaba: jei dinamiškai sukurtas komponentas turi savininką (nurodytą „A konstruktoriaus kūrimo“ parametru „AOwner“), tada tas komponentas yra atsakingas už komponento sunaikinimą. Priešingu atveju turite aiškiai paskambinti „Free“, kai jums nebereikia komponento.

Straipsnį iš pradžių parašė Markas Milleris

Delfuose buvo sukurta bandymų programa, skirta dinaminiam 1000 komponentų sukūrimui su skirtingu pradiniu komponentų skaičiumi. Testo programa pasirodo šio puslapio apačioje. Diagrama rodo bandymo programos rezultatų rinkinį, palygindama komponentų kūrimo laiką tiek su savininkais, tiek be jų. Atminkite, kad tai tik dalis įvykio. Panašaus veikimo uždelsimo galima tikėtis sunaikinant komponentus. Laikas dinamiškai kurti komponentus su savininkais yra nuo 1200% iki 107960% lėtesnis nei sukurti komponentai be savininkų, atsižvelgiant į formos komponentų skaičių ir esamą komponentą sukurta.

Testavimo programa

Įspėjimas: Ši bandymo programa nestebi ir neatlaisvina komponentų, kurie sukurti be savininkų. Nesekant ir neatleidžiant šių komponentų, dinaminio kūrimo kodo išmatuoti laikai tiksliau atspindi realų laiką, kai reikia dinamiškai sukurti komponentą.

Atsisiųsti kodą

Įspėjimas!

Jei norite dinamiškai paversti „Delphi“ komponentą ir aiškiai jį atlaisvinti kada nors vėliau, visada perduokite nulį kaip savininką. To nepadarius, gali kilti nereikalingos rizikos, taip pat našumo ir kodo priežiūros problemų. Norėdami sužinoti daugiau, perskaitykite straipsnį „Įspėjimas apie„ Delphi “dinamiškai aktyvinamus komponentus“ ...