Delphi "problem": TForm. Stvorite () - Nil, Self ili Application?

Kad stvarate Delphi objekti dinamički koji nasljeđuju od TControla, kao što je TForm (predstavlja obrazac / prozor u Delphi aplikacijama), konstruktor "Create" očekuje parametar "Owner":

konstruktor Stvori (AOwner: TComponent);

Parametar AOwner vlasnik je objekta TForm. Vlasnik obrasca odgovoran je za oslobađanje obrasca - tj. Memorije dodijeljene obrascem - kada je to potrebno. Obrazac se pojavljuje u nizu komponenti njegovog vlasnika i automatski se uništava kada se njegov vlasnik uništi.

Za parametar AOwner postoje tri izbora: Nula, samouprave, i primjena.

Da biste razumjeli odgovor, najprije morate znati značenje "nula", "sebstvo" i "primjena".

  • Nula određuje da nijedan objekt ne posjeduje obrazac i zato je programer odgovoran za oslobađanje stvorenog obrasca (pozivom na mojForm. Besplatno kad vam više ne treba obrazac)
  • sam određuje objekt u kojem se metoda zove. Ako, primjerice, stvarate novu instancu obrasca TMyForm iz alata za rukovanje OnClick gumba (gdje se taj gumb nalazi na MainForm-u), sam odnosi se na "MainForm." Kada se oslobodi MainForm, oslobodit će se i MyForm.
  • instagram viewer
  • primjena određuje globalnu varijablu tipa TApplication kreiranu kada pokrenete aplikaciju. "Aplikacija" kapsulira vašu aplikaciju, kao i pruža brojne funkcije koje se pojavljuju u pozadini programa.

Primjeri:

  1. Modalni oblici. Kada stvorite obrazac za modalni prikaz i oslobađanje kada korisnik zatvori obrazac, koristite "nil" kao vlasnik:
    var myForm: TMyForm; započnite mojForm: = TMyForm. Stvoriti(nula); probaj mojForm. ShowModal; napokon moja Forma. Besplatno; kraj; kraj;
  2. Bespomoćni oblici. Koristite "Aplikaciju" kao vlasnika:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Stvori (aplikacija);

Sada, kada zatvorite (zatvorite) aplikaciju, objekt "Application" oslobodit će instancu "myForm".

Zašto i kada je TMyForm. Stvaranje (aplikacija) NE preporučuje se? Ako je obrazac modalni oblik i bit će uništen, trebali biste proći "nulu" za vlasnika.

Mogli biste proslijediti "aplikaciju", ali vremensko kašnjenje uzrokovano načinom obavijesti koji se šalje svim komponentama i obrascu koji je u vlasništvu ili posredno posjedovanje aplikacije može se pokazati motećim. Ako se vaša prijava sastoji od mnogih obrazaca s mnogim komponentama (u tisućama), a oblik koji stvarate ima mnogo kontrola (u stotinama), kašnjenje obavijesti može biti značajno.

Ako prođete "nil" kao vlasnika umjesto "aplikacije", obrazac će se pojaviti prije, a na drugi način neće utjecati na kôd.

Međutim, ako obrazac koji trebate stvoriti nije modalni i nije stvoren iz glavnog obrasca aplikacije, tada kada kao vlasnika navedete "sebstvo", zatvaranje vlasnika će osloboditi stvoreni obrazac. Koristite "sebstvo" kada ne želite da obrazac nadživi njegova tvorca.

Upozorenje: Da biste dinamički instancirali komponentu Delphija i izričito je oslobodili nešto kasnije, uvijek dodajte "nil" kao vlasniku. Ako to ne učinite, može se uvesti nepotreban rizik, kao i problemi sa izvedbom i održavanjem koda.

U SDI aplikacije, kada korisnik zatvori obrazac (klikom na gumb [x]), obrazac još uvijek postoji u memoriji - on se samo skriva. U MDI aplikacijama, zatvaranje MDI obrasca samo ga minimizira.
OnClose događaj pruža Radnja parametar (tipa TCloseAction) koji možete koristiti da odredite što se događa kada korisnik pokuša zatvoriti obrazac. Postavljanje ovog parametra na "caFree" oslobodiće obrazac.

Navigacijski savjeti za Delphi:
»Nabavite cijeli HTML iz komponente TWebBrowser
«Kako pretvoriti piksele u milimetre