Newsgroup: it.comp.lang.delphi
Titolo: Free di puntatori a form

Quando chiudo una form (non principale) cliccando sulla sua 'X', cosiderando
che la form non è auto-create, ma creata con un codice tipo:
var
  pippo: TNomeForm;
begin
  pippo := NomeForm.Create(Self);
  pippo.ShowModal;
il puntatore pippo viene automaticamente liberato o devo manualmente mettere
un'istruzione Free nell'evento Close della form?
Grazie,
    Claudio

"Claudio Zanetta" ha scritto nel messaggio

Dipende da come devi gestire i form.
Il codice piu "elastico" è il seguente:
var
  form1: TForm1;                // oppure puoi usare direttamente la
variabile dichiarata nella unit del form
begin
  Application.CrateForm(TForm1, form1);
  try
    form1.showModal;
  finally
    form1.free;                    // oppure form1.release
  end;
end;
che ti permette di decidere come e quando liberare la memoria.
altrimenti, nell'evento onClose del form puoi impostare la variabile Action
:= caFree, per ottenere la liberazione automatica della memoria. Però in
questa situazione nella riga di codice successiva allo ShowModal non hai
possibilità di accedere ad eventuali oggetti del form.
Ciao.
Gianluca.

 mettere un'istruzione Free nell'evento Close della form?
nelle form non modali c'è l'evento OnClose fatto apposta per questo scopo:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
end;
però credo (smentitemi se sbaglio) che per le form secondarie (cioè <> 
Application MainForm) dovrebbe essere il comportamento di default.
-- 
Mauro Falzari ( 
http://digilander.libero.it/mauro.falzari
 )
"Se guardi nell'abisso, anche l'abisso guarda in te." (Friedrich Nietzsche)

 ha scritto

Se pippo e' una variabile locale, la variabile non esiste piu' al
momento in cui esci dalla procedura, mentre l'istanza rimane in memoria
(a meno di avere caFree nell'OnClose).
Se la form e' modale, in genere si usa qualcosa tipo:
procedure MostraFormDialogo(var Risultato: TRisultato);
begin
  Risultato.Valido := False;
  with TFormDialogo.Create(nil) do try
    Inizializza;
    if ShowModal = mrOk then
      EstraiRisultato(Risultato)
  finally
    Free;
  end;
end;
in modo da non doversi occupare del riferimento.
Saluti
Paolo Arosio

 Application MainForm) dovrebbe essere il comportamento di default.
no, l'azione predefinita è caHide. 
Ho fatto una velocissima prova con due form, nella prima c'è un bottone con 
agganciato all'evento onclick:
-----------------------
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  Form2: TForm2;
begin
  Form2:= TForm2.Create(nil);
  try
    Form2.Show;
  except
    FreeAndNil(Form2);
  end;
end;
-------------------------
e nella seconda c'è il segunte codice associato all'onclose:
----------
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  case Action of
    caFree: ShowMessage('caFree');
    caHide: ShowMessage('caHide');
  else
    ShowMessage('other');
  end;
end;
------------------------


 Application MainForm) dovrebbe essere il comportamento di default.
Negativo, la distinzione e' MDI / non MDI
"If a form is an SDI child form, Action defaults to caHide."
Saluti
Paolo Arosio

Ok, la var pippo viene liberata, in quanto locale, la form non è modale,
quindi Actrion:=caFree lo devo mettere lo stesso nell'evento close, ho dei
vantaggi in termini di memoria?
Saluti,
    Claudio

    pippo.ShowModal;
   finally
     pippo.Free
   end;
In Delphi non c'č liberazione automatica dei puntatori.
-- 
Andrea Laforgia
http://www.geocities.com/andrealaforgia
/* shakespeare.c */
#define QUESTION ((bb) || (!bb))

Claudio Zanetta (
claudio...@libero.it
) wrote:
[CUT]
Mi accodo per un chiarimento.
Io di solito scrivo:
    	[...]
    	pippo:=NomeForm.Create(Self);
    	pippo.ShowModal;
    	pippo.Free
    	[...]
mentre voi avete scritto:
    	[...]
    	pippo:=NomeForm.Create(Self);
    	try
    	  pippo.ShowModal;
    	finally
    	  pippo.Free
    	end;
    	[...]
Che differenza c'è?
-- 
Ciao,
   Stefano
Una volta che avete conosciuto il volo, camminerete sulla Terra guardando 
il cielo, perché là siete stati e là desiderate tornare (Leonardo da Vinci)

Che differenza c'č?
C'č che nel secondo caso sei sicuro che la form venga comunque
liberata, anche in caso vengano sollevate eccezioni.  
Nel tuo caso, invece, non č detto che lo sia, in quanto se si solleva
un'eccezione, la tua Free viene saltata a pič pari.  Tutte le volte in
cui viene usata un'operazione di allocazione ci dovrebbe essere una
corrispondente operazione di deallocazione.
Quindi, tutte le volte che hai del codice che segue l'algoritmo:
// acquisisco una risorsa
// elaboro la risorsa
// rilascio la risorsa
fai bene a trasformarlo in:
// acquisisco la risorsa
try
  // elaboro la risorsa
finally
  // rilascio la risorsa
end;


Andrea Laforgia (x@x.x) wrote:
[CUT]
Grazie.


 Ok, la var pippo viene liberata, in quanto locale, la form non è

Se la form e' modeless la gestione dipende da quel che ci devi fare: se
ne devi poter aprire istanze diverse, se ne usi una sola durante tutta
la vita dell'applicazione, se la chiusura dipende solo da eventi esterni
(fra cui l'azione dell'utente) o anche da eventi interni, ...
Quanto ai vantaggi in termini di memoria, non saprei dire: nel senso che
una form in piu' o in meno non mi ha mai cambiato la vita, mentre fra
l'avere un AV o non averlo la differenza e' sensibile.
Saluti
Paolo Arosio

 Che differenza c'č?
Il try..finally assicura che qualunque cosa accada dopo try e prima di
finally cio' che c'e' tra finally ed il corrispondente end venga
eseguito. Se ShowModal solleva un'eccezione, la form viene comunque
deallocata.
Saluti
Paolo Arosio

 ha scritto nel messaggio
news:b54ph8$24ndvh$2...@ID-30644.news.dfncis.de...


forza in OnClose?
Sì, assegni l'Action giusta (caFree).
D'altronde, il Free esplicito non ha senso, se non sai esattamente
_quando_ uscirai da un form non modale.
