Delphi "težava": TForm. Ustvari () - Nil, Self ali Application?

Ko ustvarjate Delphi predmeti dinamično ki podedujejo iz TControl, kot je TForm (predstavlja obrazec / okno v aplikacijah Delphi), konstruktor "Ustvari" pričakuje parameter "Lastnik":

konstruktor Ustvari (AOwner: TComponent);

Parameter AOwner je lastnik predmeta TForm. Lastnik obrazca je odgovoren za sprostitev obrazca - tj. Pomnilnika, ki ga dodeli obrazec - kadar je to potrebno. Obrazec se prikaže v nizu komponent svojega lastnika in se samodejno uniči, ko se uniči njegov lastnik.

Za parameter AOwner imate tri možnosti: Nil, jaz, in prijava.

Če želite razumeti odgovor, morate najprej vedeti pomen "nič", "jaz" in "aplikacija".

  • Nil določa, da noben predmet ni lastnik obrazca, zato je razvijalci odgovoren za sprostitev ustvarjenega obrazca (s klicem na mojForm. Brezplačno, ko obrazca ne potrebujete več)
  • Jaz določa predmet, v katerem se imenuje metoda. Če na primer ustvarjate nov primerek obrazca TMyForm iz vodnika OnClick gumba (kjer je ta gumb nameščen na MainForm), jaz se nanaša na "MainForm." Ko se osvobodi MainForm, bo sproščen tudi MyForm.
  • instagram viewer
  • Uporaba določa globalno spremenljivko vrste TApplication, ki je bila ustvarjena, ko zaženete aplikacijo. "Aplikacija" zajema vašo aplikacijo in nudi številne funkcije, ki se pojavljajo v ozadju programa.

Primeri:

  1. Modalni obrazci. Ko ustvarite obrazec, ki bo modalno prikazan in sproščen, ko uporabnik zapre obrazec, uporabite "nič" kot lastnik:
    var myForm: TMyForm; začnite mojForm: = TMyForm. Ustvari (nič); poskusite z mojo obliko. ShowModal; končno moja oblika. Prost; konec; konec;
  2. Brez modelov. Kot lastnik uporabite aplikacijo:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Ustvari (aplikacija);

Ko končate (zapustite) aplikacijo, bo objekt "Application" sprostil primerek "myForm".

Zakaj in kdaj je TMyForm. Ustvari (aplikacija) NI priporočljivo? Če je obrazec modalna oblika in bo uničen, morate lastniku prenesti "nič".

Lahko prenesete "aplikacijo", vendar pa lahko časovna zamuda, ki jo povzroči metoda obveščanja, poslana vsaki komponenti in obrazcu, ki je v lasti ali posredno v lasti aplikacije, moti. Če je vaša prijava sestavljena iz številnih obrazcev z veliko sestavnimi deli (v tisočih) in ima obrazec, ki ga ustvarite, veliko kontrol (v stotinah), je zamuda pri notifikaciji lahko pomembna.

Če lastnik namesto "aplikacije" prenese "nič", bo obrazec prikazal hitreje in drugače ne bo vplival na kodo.

Če pa obrazec, ki ga morate ustvariti, ni modalističen in ni ustvarjen iz glavnega obrazca aplikacije, potem ko kot lastnika navedete "self", bo z zapiranjem lastnika ustvarjeni obrazec sproščen. Uporabite "sebstvo", ko ne želite, da obrazec presega svojega ustvarjalca.

Opozorilo: Če želite dinamično sprožiti komponento Delphi in jo izrecno sprostiti nekje pozneje, kot lastnik vedno dodajte "nič". Če tega ne storite, lahko povzročite nepotrebno tveganje, pa tudi težave z zmogljivostjo in vzdrževanjem kode.

V Aplikacije SDI, ko uporabnik zapre obrazec (s klikom na gumb [x]), obrazec še vedno obstaja v pomnilniku - le skrije se. V MDI aplikacijah zapiranje obrazca za MDI le zmanjša na minimum.
The OnClose dogodek zagotavlja Ukrep parametra (vrste TCloseAction), s katerim lahko določite, kaj se zgodi, ko uporabnik poskuša zapreti obrazec. Če nastavite ta parameter na "caFree", bo obrazec sproščen.

Navigacija namigov za Delphi:
»Pridobite celoten HTML iz komponente TWebBrowser
«Kako pretvoriti piksle v milimetre

instagram story viewer