2014-12-09 11 views
5

Ho un modulo principale che crea un secondo modulo dinamicamente in fase di esecuzione. Quando si chiama il metodo di creazione, il proprietario del secondo modulo viene impostato sul modulo principale. Quando chiudo l'applicazione, lo FormDestroy del modulo principale viene chiamato prima dello FormDestroy del secondo modulo.Perché una forma di proprietà è distrutta dopo la forma del proprietario stesso?

Normalmente suggerirei che il proprietario distrugga tutte le forme di proprietà e successivamente si distrugge.

Perché l'ordine di distruzione della forma è così?

risposta

9
  • L'evento OnDestroy di un modulo viene generato dal suo metodo BeforeDestruction.
  • Un componente distrugge i componenti di proprietà dal suo distruttore.

Il metodo BeforeDestruction viene eseguito prima del distruttore e quindi il comportamento che si osserva.

È il caso che i componenti di proprietà vengono distrutti prima del loro proprietario. Immagina che fosse il contrario. Se il proprietario è stato distrutto per primo, l'elenco dei componenti di proprietà sarebbe stato distrutto e non ci sarebbe stato alcun modo per distruggere i componenti di proprietà.

Ciò che ti confonde è che quando un proprietario inizia il suo processo di distruzione, un certo numero di cose accade prima che raggiunga il punto in cui distrugge qualsiasi componente di proprietà. E una di queste cose è licenziare il proprio evento OnDestroy.

L'albero delle chiamate per la distruzione del form principale sembra un po 'come questo:

TMainForm.BeforeDestruction 
    TCustomForm.BeforeDestruction 
    TCustomForm.DoDestroy 
     TMainForm.FormDestroy --> this is your main form's OnDestroy event handler 
TMainForm.Destroy 
TForm.Destroy 
.... 
TComponent.Destroy 
    DestroyComponents;   --> owned components are destroyed here 
.... 

Con il tempo la forma principale ha chiamato DestroyComponents da dentro la sua TComponent.Destroy, tutti i componenti di proprietà sono state distrutte. Quindi il modulo principale completa il suo processo di distruzione e poi anche questo è stato distrutto.

+1

Vedo un altro vantaggio per questo ordine: All'interno dei gestori di eventi del modulo, tutti i componenti del modulo sono sicuri di esistere. Allo stesso modo, l'evento 'OnCreate' della forma si attiva * dopo * tutti i componenti di proprietà (preconfigurati) sono stati creati. In entrambi i casi, aiuta RAD ad avere tutto disponibile in * tutti * gli eventi di base. –

+0

Per completezza, 'DoDestroy()' è chiamato in 'BeforeConstruction()' ** only ** se la proprietà 'OldCreateOrder' è false (che di solito è), altrimenti' DoDestroy() 'è chiamato in' Destroy del modulo() 'distruttore invece. –

Problemi correlati