Newsgroup: it.comp.lang.delphi
Titolo: Distruggere un istanza

 Mi serve chiamare la destroy di un componente il problema è ke solo se 
è istanziato ma non so' come faccio a saperlo...
--- posted by geoForum on 
http://www.delphiedintorni.it

 se č istanziato ma non so' come faccio a saperlo...
Chiama il metodo Free piuttosto che il Destroy.
guastatore

 č istanziato ma non so' come faccio a saperlo...
Non puoi non sapere se un componente č istanziato se sei tu che lo devi 
creare. :-)
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

è istanziato ma non so' come faccio a saperlo...
If Assigned(miocomponente) then miocomponente.Free;
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 If Assigned(miocomponente) then miocomponente.Free;
Non funziona sempre. Se /miocomponente/ è diverso da *nil*, il test 
della condizione va a buon fine ma il componente cui punta la variabile 
potrebbe già essere distrutto.
L'uso del metodo /Free/ in generale, come suggerito, dovrebbe 
controllare questa condizione, ma io sinceramente preferirei organizzare 
il codice in modo da essere assolutamente certo di distruggere ciò che 
va distrutto lasciando intatto ciò che non va toccato. :-)


 toccato. :-)
Sicuramente č buona norma e pratica di programmazione. ;-)
Ciao !

va distrutto lasciando intatto ciò che non va toccato. :-)
Sicuramente :)
Non ero a conoscenza del fatto che la Free faccia di suo un controllo
sull'esistenza dell'oggetto stesso, siccome pensavo che chiamare la free di un
qualcosa che non esiste desse un bel AV: ecco il perche' del preventivo "if
Assigned(..)" (che ovviamente non mi ripara dalla presenza di valori spuri nel
puntatore).
Forse mi sono espresso male... sara' la sindrome da lunedi' mattina?? ;)
Ciao


Forse sbagliero' qualcosa pero' a me da errore.
L'oggetto ke sto cercando di distruggere č un dialog di ricerca, ke si 
deve chiudere quando apro la finestra di elenco.
Questo dialog oviamente non lo apro sempre ma solo se l'utente lo 
richiede, e oltrettutto la prima volta non lo creo io ma la seconda 
eseguo questa procedura:
AdvFindDialog1:= TADVFindDialog.Create(Self);


Vi kiedo umilmente scusa.... ho dikiarato l'oggetto non prendendolo 
dall'elenco degli oggetti ma istanziandolo da run-time e ora funziona 
tutto grazie!!!!


tutto grazie!!!!
Comunque un FreeAndNill(Istance); molte volte puň
essere piů indicato di un semplice Istance.Free;
soprattutto se poi si fanno delle vautazioni di
istanza come Assigned(Variable).
	Ciao
	MassimoB
 
---------------------------
http://www.massimobeschi.it/

 ha scritto nel messaggio
news:enKcd.11933$1q2....@tornado.fastwebnet.it...


 free di un qualcosa che non esiste desse un bel AV: ecco il perche' 
Free è un metodo _statico_ (non è virtuale/dinamico) e _non accede_ a dati
di istanza. Per questo motivo funziona anche se l'oggetto non è
istanziato, perché il compilatore genera una CALL "diretta" all'indirizzo
della procedura (che è fisso) e non una CALL "indiretta" recuperando
l'indirizzo dalla tabella dei metodi virtuali (che richiede una istanza
valida per accedervi).
Poiché Delphi passa comunque il parametro Self prendendolo dalla variabile
che dovrebbe puntare all'istanza, Free non fa altro che fare un 
if Self <> nil then
  Destroy;
Destroy è invece virtuale e di solito accede a dati di istanza, e fallisce
con una eccezione se invocato su una istanza non valida (se va bene, se va
male fa cose peggiori).
Se ci si assicura che una istanza o è valida o è nil, si può usare Free
senza preoccuparsi. Attenzione però che Free non mette a nil la variabile,
ma la lascia indefinita. Da Delphi 6 si può uare FreeAndNil() per chiamare
la Free e porre a nil la variabile.
Luigi D. Sandon - D&amp;D Support Team
