Newsgroup: it.comp.lang.delphi
Titolo: Liberare oggetto con Free

date 2 form (Form1 , Form2) , Form2 viene creato a runtime,
ho un'azione sul Form1
quando creo il Form lo imposto come Attivo:=True
sul form creato dall'evento onClose imposto il Form su Attivo:=False
l'evento on Update dell'Action verifica quando il Form2 e' stato distrutto
e impostato Attivo:= False
Al verificarsi della condizione eseguo FormX.Free; ma va in errore
"Invalid Pointer Operation"
FormX e' di tipo TForm2 dichiarato nella sezione Private
dato che FormX si incarica di creare il nuovo Form , anche dopo la 
distruzione
di Form2 , FormX e' ancora <> nil , non capisco perche' non posso liberare
risorse con Free.
Maurizio
procedure TForm1.Button1Click(Sender: TObject);
begin
  FormX:=TForm2.Create(Self);
  with FormX do
  begin
    Parent:=ScrollBox1;
    Left:=0; Top:=0;
    Width:=ScrollBox1.ClientWidth;
    Height:=ScrollBox1.ClientHeight;
    sNomeForm:=FormX.Name;
    sStato:='A';
    unt_Globale.StatoForm(sNomeForm,sStato);
    Show;
    // se metto ShowModal
   // FormX.Free ovviamete funziona , ma non voglio un form modale
  end;
end;
procedure TForm1.Action1Update(Sender: TObject);
var i,x:Integer;
begin
  if FormX<>nil  then
  begin
    // veifica il flag del form False=Form distrutto
    sStatoForm:=unt_Globale.LeggeStatoForm(sNomeForm);
    // se il form (Form2) e' stato distrutto
    if not sStatoForm then  FormX.Free;
  end;
end; 

Creo oggetto A
pongo A=B
Non posso fare Free di A senza ottenere un Free di B.
vedi come gestisce la memoria Delphi
--- posted by geoForum on 
http://www.delphiedintorni.it

>di Form2 , FormX e' ancora <> nil , non capisco perche' non posso 
Free non mette FormX a nil. Dopo che chiami FormX.Free, FormX punterà a 
qualcosa che non è più valido. Prova con FreeAndNil, almeno.
Comunque il codice nell'OnUpdate è qualcosa da far venire i brividi... 
così come quegli accessi al form per nome... brrrrr!
Ci sono probabilmente mille modi migliori per fare quello che stai 
facendo.


> facendo.
non ho dubbi che sia cosi' , perche' non provi a postarne almeno uno di
questi mille, almeno imparo qualcosa di nuovo.

questi mille, almeno imparo qualcosa di nuovo.
Spiega esattamente cosa vuoi fare (non come lo fai, ma cosa vuoi fare), 
e si potrà consigliare la soluzione più adatta.


>
cio'' che voglio fare e' questo
da un Form primario (mettiamo Form1) , creo a runtime
un Form secondario (Form2);
quello che mi interessa e' sapere quando Form2e' stato chiuso
(distrutto con caFree)
dal momento che Form1 puo' fare riferimento a Form2 devo
trovare un modo (un flag) per sapere che quando creo Form2
quindi avevo pensato ad una classe visibile siua da Form1 che Form2
e  l'evento OnUpdate su Form1 per interrogare.
perche' voglio questo ?
mettiamo che Form2 sia un package caricato a runtime,
da Form1 lo carico , lo visualizzo (non Modale), per poterlo
scaricare devo sapere se Form2) e stato chiuso e poter scaricare
il package.
logico che se faccio diventa semplice,
try
  LoadPackage(xxx)
  ShowModal
finally
  UnloadPackage(xxx)
end;
ma se non e' modale la cosa cambia
try
  LoadPackage(xxx)
  Show
finally
  // UnloadPackage(xxx) --> questo non ha piu' senso
end;
Maurizio 

 Form2) e stato chiuso e poter scaricare il package.
Se il package e la form2 sono correlati, è logico che sia form2 a dover 
caricare il package alla sua creazione, nell'evento form2.Create, e 
distruggerlo nell'evento form2.Close.

mettiamo che Form2 sia un package caricato a runtime,
Vedi tu se vale la pena caricare e scaricare quel package in 
continuazione. Il caricamento di un package ha un "costo" (fix degli 
indirizzi, registrazione delle classi, ecc. ecc.), anche per i package 
dinamici può avere senso caricarli in un determinato momento e 
scaricarli quando veramente non servono più.


 diverse di memoria che referenziano la stessa istanza
O non essercene affatto (v. with).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

...la butto lě...
per sapere se una form č ancora "in vita" non č sufficiente un:
[...]
  If Application.FindComponent('NomeForm') <> nil then 
[...]
??
Francesco.
