Originariamente inviato da sebaldar
codice:
Form2 := TForm2.Create(nil);
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.
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.
Originariamente inviato da camaleonteplus
Nel chiedere il Form2 sulla X mi da questo errore:
"Access Violation"
[...]
Come posso procedere? -Thanks
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".
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:
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;
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(Application);
Frm.Show;
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(Self); // "Self" rappresenta qui l'istanza di TForm1
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).