Delphi-komponenttien luominen dynaamisesti (ajon aikana)

click fraud protection

Useimmiten, kun ohjelmoit Delphissä, sinun ei tarvitse luoda komponenttia dynaamisesti. Jos pudotat komponentin lomakkeelle, Delphi käsittelee komponentin luomisen automaattisesti, kun lomake luodaan. Tämä artikkeli käsittelee oikean tavan luoda komponentteja ohjelmallisesti ajon aikana.

Dynaaminen komponenttien luominen

Komponenttien luomiseksi dynaamisesti on kaksi tapaa. Yksi tapa on tehdä muoto (tai jokin muu TComponent) uuden komponentin omistajaksi. Tämä on yleinen käytäntö rakennettaessa komposiittikomponentteja, joissa visuaalinen kontti luo ja omistaa alakomponentit. Näin varmistetaan, että vastikään luotu komponentti tuhoutuu, kun omistava komponentti tuhoutuu.

Voit luoda luokan esiintymän (objektin) kutsumalla sen "Luo" -menetelmää. Luo rakentaja on luokan menetelmä, toisin kuin käytännöllisesti katsoen kaikki muut menetelmät, joita kohtaat Delphi-ohjelmoinnissa, jotka ovat objektimenetelmiä.

Esimerkiksi TComponent julistaa Luo rakentajan seuraavasti:

rakentaja Luo (AOwner: TComponent); virtuaalinen;

instagram viewer

Dynaaminen luominen omistajien kanssa
Tässä on esimerkki dynaamisesta luomisesta, missä itse on TComponent tai TComponent jälkeläinen (esim. TForm-esimerkki):

TTimerin kanssa. Luo (itse) tee
alkaa
Väli: = 1000;
Käytössä: = Väärä;
OnTimer: = MyTimerEventHandler;
end;

Dynaaminen luominen nimenomaisella ilmaiskutsulla
Toinen tapa luoda komponentti on käyttää nolla omistajana. Huomaa, että jos teet tämän, sinun on myös vapautettava luomasi objekti nimenomaisesti heti, kun et enää tarvitse sitä (tai tuot muistivuoto). Tässä on esimerkki nollan käyttämisestä omistajana:

kanssa TTable. Luo (nolla) tee
yrittää
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Avata;
Muokata;
FieldByName ('Varattu'). AsBoolean: = True;
Lähettää;
vihdoin
Vapaa;
end;

Dynaaminen luominen ja objektiviitteet
Kaksi aikaisempaa esimerkkiä on mahdollista parantaa määrittämällä Luo puhelun tulos paikalliselle muuttujalle menetelmälle tai luokalle. Tämä on usein toivottavaa, kun viitataan komponentti on käytettävä myöhemmin tai milloin rajauksen "With" -lohkojen mahdollisesti aiheuttamia ongelmia on vältettävä. Tässä on TTimer-luomiskoodi ylhäältä, käyttämällä kenttämuuttujaa viitteenä toteutettuun TTimer-objektiin:

FTimer: = TTimer. Luo (itse);
FTimerin kanssa
alkaa
Väli: = 1000;
Käytössä: = Väärä;
OnTimer: = MyInternalTimerEventHandler;
end;

Tässä esimerkissä "FTimer" on lomakkeen tai visuaalisen säilön yksityinen kenttämuuttuja (tai mikä tahansa "itse"). Kun käytät FTimer-muuttujaa tämän luokan menetelmistä, on erittäin hyvä idea tarkistaa, onko referenssi kelvollinen ennen sen käyttöä. Tämä tehdään käyttämällä Delphin Assisted -toimintoa:

jos määritetty (FTimer), niin FTimer. Käytössä: = Totta;

Dynaaminen luominen ja objektiviitteet ilman omistajia
Vaihtoehto on luoda komponentti ilman omistajaa, mutta pitää viite myöhempää tuhoamista varten. TTimerin rakennuskoodi näyttää tältä:

FTimer: = TTimer. Luo (nolla);
FTimerin kanssa
alkaa
...
end;

Ja tuhouskoodi (oletettavasti lomakkeen tuhoaja) näyttäisi noin:

FTimer. Vapaa;
FTimer: = nolla;
(*
Tai käytä FreeAndNil (FTimer) -menettelyä, joka vapauttaa objektiviitteen ja korvaa referenssin nollalla.
*)

Objektiviittauksen asettaminen nollalle on kriittistä, kun objekteja vapautetaan. Vapaa puhelu tarkistaa ensin, onko kohdeviittaus nolla vai ei, ja jos ei, soittaa esineen tuhoajalle.

Dynaaminen luominen ja paikalliset objektiviitteet ilman omistajia

Tässä on TTable-luomakoodi ylhäältä, käyttämällä paikallista muuttujaa viitteenä toteutettuun TTable-objektiin:

localTable: = TTpöytä. Luo (nolla);
yrittää
kanssa localTable tehdä
alkaa
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
end;
...
// Myöhemmin, jos haluamme määritellä nimenomaisesti soveltamisalan:
localTable. Avata;
localTable. Muokata;
localTable. FieldByName ('Varattu'). AsBoolean: = True;
localTable. Lähettää;
vihdoin
localTable. Vapaa;
localTable: = nolla;
end;

Yllä olevassa esimerkissä "localTable" on paikallinen muuttuja ilmoitetaan samalla menetelmällä, joka sisältää tämän koodin. Huomaa, että minkä tahansa objektin vapauttamisen jälkeen on yleensä erittäin hyvä idea asettaa viite nollaan.

Varoituksen sana

TÄRKEÄÄ: Älä sekoita Free-puhelua voimassa olevan omistajan siirtämisen kanssa rakentajalle. Kaikki aiemmat tekniikat toimivat ja ovat kelvollisia, mutta seuraavien pitäisi koskaan esiinny koodissasi:

kanssa TTable. Luo (itse) tehdä
yrittää
...
vihdoin
Vapaa;
end;

Yllä oleva koodiesimerkki tuo esiin tarpeettomia suorituskykyhäiriöitä, vaikuttaa muistiin hieman ja tarjoaa mahdollisuuden tuoda vaikeasti löydettäviä virheitä. Saada selville miksi.

Huomaa: Jos dynaamisesti luodulla komponentilla on omistaja (määritetty Luo rakentajan AOwner-parametrilla), kyseinen omistaja on vastuussa komponentin tuhoamisesta. Muussa tapauksessa sinun on nimenomaisesti soitettava Ilmaiseksi, kun et enää tarvitse komponenttia.

Artikkelin alun perin kirjoittanut Mark Miller

Delphissä luotiin testiohjelma, joka ajoi 1000 komponentin dynaamisen luomisen vaihtelevilla alkukomponenttimäärillä. Testiohjelma näkyy tämän sivun alareunassa. Kaavio näyttää testiohjelman tulosten joukon, jossa verrataan komponenttien luomisen aikaa sekä omistajien kanssa että ilman. Huomaa, että tämä on vain osa osumasta. Samanlaista suoritusviivettä voidaan odottaa tuhoamalla komponentteja. Aika komponenttien dynaamiseen luomiseen omistajien kanssa on 1200–107960% hitaampaa kuin luominen komponentit ilman omistajia, lomakkeen komponenttien lukumäärän ja komponentin mukaan luotu.

Testiohjelma

Varoitus: Tämä testiohjelma ei seuraa ja vapauta komponentteja, jotka on luotu ilman omistajia. Koska näitä komponentteja ei jäljitetä ja vapauteta, dynaamisen luomiskoodin mitatut ajat kuvaavat tarkemmin reaaliaikaa komponentin dynaamiseksi luomiseksi.

Lataa lähdekoodi

Varoitus!

Jos haluat päivittää Delphi-komponentin dynaamisesti ja vapauttaa sen nimenomaisesti joskus myöhemmin, lähetä aina omistaja nolla. Tämän tekemättä jättäminen voi aiheuttaa tarpeettomia riskejä sekä suorituskykyyn ja koodin ylläpitoon liittyviä ongelmia. Lue artikkeli "Varoitus Delphin komponenttien dynaamisesta hetkellisestä aktivoinnista" saadaksesi lisätietoja ...

instagram story viewer