Newsgroup: it.comp.lang.delphi
Titolo: Create & Free

Ho un piccolo problema che vorrei risolvere sciogliendomi così anche
qualche dubbio. All'interno del mio programma vi è una procedura che
dovrebbe creare un TClientDataSet quando questo non è stato
inizializzato. Fin'ora ho sempre utilizzato la funzione "Assigned" per
capire se questo è stato inizializzato o meno:
  if not Assigned(clientdataset1) then
    clientdataset1 := Tclientdataset.create(Nil);
Ciò che vi chiedo è come mai, una volta liberato l'oggetto con il
comando Free, quando richiamo quella procedura mi riconosce ancora
assegnato il clientdataset1. La procedura "Free" non dovrebbe eliminarlo
del tutto? Oppure sbaglio l'utilizzo di "Assigned"?
Grazie 1000
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Grazie 1000
Ciao,
Free NON assegna NIL a clientdataset1, devi usare
FreeAndNill(clientdataset1) in questo modo clientdataset1 sara' NIL.
Bye.

 FreeAndNill(clientdataset1) in questo modo clientdataset1 sara' NIL.
  ^^^^^^^^^^^
  FreeAndNil(clientdataset1)

del tutto? Oppure sbaglio l'utilizzo di "Assigned"?
Perchč non usi semplicemente
  if clientdataset1 = nil then...
Non ho mai usato Assigned e non ne ho mai avuto bisogno.
Sergio Pappalardo aka Silver Black
--- posted by geoForum on 
http://www.delphiedintorni.it

Sergio Pappalardo aka Silver Black
Ciao,
Massimo.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

   clientdataset1.Free;
il create dovrebbe stare fuori del try...
A

il create dovrebbe stare fuori del try...
Questo è sbagliatissimo e anche Massimo è caduto nell'errore. Se 
scriviamo:
  slList := TStringList.Create;
  objCiao := TSaluto.Create;
  try
    { lavoro con slList }
  finally
    objCiao.Free;
    slList.Free;
  end;
Questo codice garantisce che entrambi gli oggetti vengano liberati? No. Se 
il costuttore per TSaluto fallisce, il programma non entra nel Try e 
quindi il finally non è chiamato e la memoria per slList non è rilasciata.
Come soluzione si possono avere due try finally annidati. Questo funziona 
ma non è elegante, specialmente se gli oggetti sono molti.
La soluzione si basa sul fatto che il Free di Delphi non libera un oggetto 
che è nil. Quindi è possibile scrivere:
  objCiao := nil;
  try


il create dovrebbe stare fuori del try...
Questo è sbagliatissimo e anche Massimo è caduto nell'errore. Se 
scriviamo:
  slList := TStringList.Create;
  objCiao := TSaluto.Create;
  try
    { lavoro con slList }
  finally
    objCiao.Free;
    slList.Free;
  end;
Questo codice garantisce che entrambi gli oggetti vengano liberati? No. Se 
il costuttore per TSaluto fallisce, il programma non entra nel Try e 
quindi il finally non è chiamato e la memoria per slList non è rilasciata.
Come soluzione si possono avere due try finally annidati. Questo funziona 
ma non è elegante, specialmente se gli oggetti sono molti.
La soluzione si basa sul fatto che il Free di Delphi non libera un oggetto 
che è nil. Quindi è possibile scrivere:
  objCiao := nil;
  try
    objCiao := TSaluto.Create;
  finally
    objCiao.Free;
  end;
E anche se il costruttore fallisce, la chiamata a free non fallirà! E non 
verrà sollevata alcuna eccezione!!!! Quindi esattamente il contrario di 
quanto affermato da voi.
Riassumendo: 
- inizializzo l'oggetto a nil prima del create
- il costruttore fallisce (non viene allocata la memoria a objCiao)
- objCiao mantiene il valore nil
- la chiamata a Free non fallisce!
Estendendo il discorso a più oggetti diventa:
  objCiao := nil;
  slList := nil;
  try
    slList := TStringList.Create;
    objCiao := TSaluto.Create;
    // lavoro con gli oggetti
  finally
    objCiao.Free;
    slList.Free;
  end;
La soluzione dei blocchi try/finally annidati è classicamente una migliore 
soluzione, ma l'ultima (esplicitamente settare gli oggetti a nil, come ho 
fatto io nel mio primo post) e affidarsi al fatto che la free non 
distrugge gli oggetti settati a nil, è più elegante e soprattutto 
conveniente.
Ad ogni modo se non ci sono più oggetti e se non si inizializza a nil 
l'oggetto, il create va fuori dal Try..Finally (accademia classica).
Ciao!
P.S.
scusate il mezzo post di prima, ma mi è scappato l'invio


   end;
Non e' lo stesso codice di Massimo. Il modo piu' sicuro - forse
anche corretto - per gestire questo caso e' usare dei try..finally
annidiati:
slList := TStringList.Create;
try
  objCiao := TSaluto.Create;
  try
    // codice
  finally
    objCiao.free;
  end;
finally
  slList.Free;
end;
Ciao.
--
ACSH
[D4]
---------------------------
Chi fa da se'
fatica il doppio

 scriviamo:
Non è affato sbagliato...
Ti consiglierei di visitare la seguente pagina:
http://www.delphibasics.co.uk/RTL.asp?Name=Try
--
Acqua

Sergio Pappalardo aka Silver Black
Ciao,
massimo.

 ha scritto nel messaggio
news:fOjxc.27886$G%.15863@tornado.fastwebnet.it...
