In questo modo però, il Form non viene mai distrutto, tranne quando l'applicazione viene chiusa, a meno di prendere provvedimenti specifici in un'altra parte del codice.Originariamente inviato da sebaldar
codice:Form2 := TForm2.Create(nil);
Occorre fare attenzione a non generare memory leak, cioè a garantire che ogni oggetto creato venga in qualche modo distrutto al termine del suo utilizzo.
In riferimento alla domanda originale, pubblico la medesima risposta che ho dato altrove, in un altro forum.
Il metodo costruttore Create della classe TForm (e discendenti) si aspetta come parametro un cosiddetto owner, cioè il riferimento a un componente che - quando viene distrutto - si occupi automaticamente di distruggere e rilasciare quindi la memoria relativa a tutti gli oggetti "posseduti".Originariamente inviato da camaleonteplus
Nel chiedere il Form2 sulla X mi da questo errore:
"Access Violation"
[...]
Come posso procedere? -Thanks
Non è chiaro perché tu abbia specificato come parametro addirittura un tipo (TForm2), che ha ancora meno senso.
Le finestre secondarie si possono creare senza owner qualora si tratti di finestre di dialogo modali, con un codice simile a questo:
oppure si assegna come owner l'applicazione se si vuole aprire una finestra senza memorizzarsi il suo riferimento e consentendo che venga chiusa al termine dell'applicazione:codice:procedure TForm1.Button1Click(Sender: TObject); var Frm: TForm2; begin Frm := TForm2.Create(nil); try if Frm.ShowModal = mrOk then Caption := 'Yes' else Caption := 'No'; finally Frm.Free; end; end;
o in alternativa si lega la distruzione della finestra ad un'altra finestra già istanziata:codice:procedure TForm1.Button1Click(Sender: TObject); var Frm: TForm2; begin Frm := TForm2.Create(Application); Frm.Show; end;
In ogni caso, è sufficiente leggere la documentazione di Delphi o ricercare articoli che trattano i concetti di ownership dei componenti per capire il meccanismo e conoscere qual è il parametro corretto da passare in base al contesto e il comportamento che ne consegue. In occasioni come questa, andare invece a mettere un parametro del tutto casuale o ipotetico, si ottengono solo guai (come ampiamente dimostrato dall'errore di Access Violation riscontrato).codice:procedure TForm1.Button1Click(Sender: TObject); var Frm: TForm2; begin Frm := TForm2.Create(Self); // "Self" rappresenta qui l'istanza di TForm1 Frm.Show; end;![]()

Rispondi quotando