TForm.Create (AOwner)

Quando si creano dinamicamente oggetti Delphi che ereditano da TControl, come un TForm (che rappresenta un modulo / finestra nelle applicazioni Delphi), il costruttore "Crea" si aspetta un parametro "Proprietario":

costruttore create (AOwner: TComponent);

Il parametro AOwner è il proprietario dell'oggetto TForm. Il proprietario del modulo è responsabile della liberazione del modulo, ovvero della memoria allocata dal modulo, quando necessario. Il modulo viene visualizzato nella matrice Componenti del suo proprietario e viene distrutto automaticamente quando il proprietario viene distrutto. 

Sono disponibili tre opzioni per il parametro AOwner: zero, se stesso, e applicazione.

Per capire la risposta, devi prima conoscere il significato di "zero", "auto" e "Applicazione".

  • zero specifica che nessun oggetto possiede il modulo e quindi lo sviluppatore è responsabile della liberazione del modulo creato (chiamando myForm.Free quando non è più necessario il modulo)
  • Se stesso specifica l'oggetto in cui viene chiamato il metodo. Se, ad esempio, stai creando una nuova istanza di un modulo TMyForm dall'interno del gestore OnClick di un pulsante (dove questo pulsante è posizionato su un MainForm), se stesso fa riferimento a "MainForm." Pertanto, quando viene liberato MainForm, anche MyForm verrà liberato.
  • Applicazione specifica una variabile di tipo TApplication globale creata quando si esegue l'applicazione. "Applicazione" incapsula l'applicazione oltre a fornire molte funzioni che si verificano in background del programma.

Esempi:

  1. Forme modali. Quando si crea un modulo da visualizzare in modo modale e liberato quando l'utente chiude il modulo, utilizzare "zero" come proprietario:
    var myForm: TMyForm; inizia myForm: = TMyForm.Create (zero); provare myForm.ShowModal; infine myForm.Free; fine; fine;
  2. Forme non modali. Usa "Applicazione" come proprietario:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm.Create (Applicazione);

Ora, quando si termina (esce) l'applicazione, l'oggetto "Applicazione" libererà l'istanza "myForm".

Perché e quando TMyForm.Create (applicazione) NON è raccomandato? Se il modulo è un modulo modale e verrà distrutto, dovresti passare "zero" per il proprietario.

È possibile passare "applicazione", ma il ritardo causato dal metodo di notifica inviato a ogni componente e modulo posseduti o posseduti indirettamente dall'Applicazione potrebbe rivelarsi dirompente. Se la tua applicazione è composta da molti moduli con molti componenti (a migliaia) e il modulo che stai creando ha molti controlli (a centinaia), il ritardo di notifica può essere significativo.

Se si passa "zero" come proprietario anziché "applicazione", il modulo verrà visualizzato prima e non influirà in altro modo sul codice.

Tuttavia, se il modulo che è necessario creare non è modale e non viene creato dal modulo principale dell'applicazione, quando si specifica "self" come proprietario, la chiusura del proprietario libererà il modulo creato. Usa "sé" quando non vuoi che il modulo sopravviva al suo creatore.

avvertimento: Per creare un'istanza dinamica di un componente Delphi e liberarlo esplicitamente in seguito, passare sempre "zero" come proprietario. In caso contrario, si possono presentare rischi inutili, nonché problemi di manutenzione del codice e delle prestazioni.

Nelle applicazioni SDI, quando un utente chiude il modulo (facendo clic sul pulsante [x]) il modulo esiste ancora nella memoria: viene nascosto solo. Nelle applicazioni MDI, la chiusura di un modulo figlio MDI lo riduce al minimo.
Il OnClose evento fornisce un Azione parametro (del tipo TCloseAction) che puoi utilizzare per specificare cosa succede quando un utente tenta di chiudere il modulo. Impostando questo parametro su "caFree" si libererà il modulo.

Navigatore suggerimenti Delphi:
"Ottieni l'HTML completo dal componente TWebBrowser
"Come convertire pixel in millimetri