![]() |
FreeAndNil VS Free
Hola a tod@s:
Bien la duda que me asalta el día de hoy es la siguiente: cual es la función mas indicada para destruir un objeto para este caso un formulario
o y muy en concreto cual es la diferencia entre las dos funciones Agradezco de antemano gertorresm Colombia |
muy buena pregunta....
no me habia puesto a indagar sobre el tema yo libero los formularios asi
|
Cita:
es equivalente a
La única razón para usar FreeAndNil al momento de liberar un objeto es asegurarte que el objeto apunta a nil y no a una dirección de memoria arbitraria. Esto te puede servir si posteriormente utilizas la variable y quieres saber si sigue "vivo":
Pero, en el caso que propones, siendo una variable temporal que no se usa posteriormente, no tiene nonguna ventaja poner la variable en nil ni, por tanto, usar FreeAndNil. // Saludos |
Cita:
// Saludos |
Para preguntar en cualquier parte de tu programa si uno de tus formularios concretos está o no creado, al menos yo, pregunto por
La única manera de que te devuelva False, es decir, que el Formulario no está creado, es que MiForm sea igual a Nil Si Haces sólo un Free del formulario, no se pone a 'Nil' y por lo tanto la pregunta anterior siempre te dará True incluso aunque hayas 'liberado' tu formulario con Free. Por eso FreeAndNil, o simplemente también sirve :
... sobre gustos ... |
... se me adelantó el Maestro Roman !! :o
|
como comentario adicional encontre esto que quiza te ayude
|
mmm me puse a cambiar los...
frmBalance := nil por FreeandNil(frmBalance) y me sale el siguiente mensaje de error cuando cierro un formulario Invalid Pointer operation what da faq???? |
la forma como creo los formularios es asi (dentro de un formulario Main)
cuando coloco freeandnil(frmbalance) en el destroy o en el close....me sale el error mencionado pero si coloco esto en el destroy no me aparece mensaje
me libera ? si? no? antes de llamar al formulario balance coloque esto y siempre es nil me olvidaba coloco action := caFree; en el close esta bien asi? |
Habría que ver el contexto. Por ejemplo, si llamas FreeAndNil desde el mismo formulario frmBalance, podría suceder el error que pones. En ese caso tendrías que usar Release en lugar de Free.
// Saludos |
me atrevo a preguntar
cual es la diferencia entre frmBalance := TfrmBalance.create(nil) ; y frmBalance := TfrmBalance.create(self); |
Cita:
entonces lo correcto seria frmBalance.nil; frmBalance.free; ??? |
No, no puedes hacerlo así, primero hay que liberar la memoria y luego asignarle nil a la misma.
Por eso el orden correcto es x.free; x:=nil; o más cómodo: freeandnil(x); Si lo haces al revés, asignas nil, entonces cuando llamas a free no hace nada porque está a nil. Edito: he contestado lo de antes sin haber visto tu último mensaje :) |
Concluyendo....
primero free y despues nil y nunca nu freeandnil dentro del mismo form |
Cita:
El boot :) |
mmmm
deberias ver a los acrobatas que hay por aca... desafian las reglas de la fisica :D:D:D |
Hola...
oscarac, no es recomendable usar la variable que declara Delphi cuando creas un formulario nuevo:
dentro de los métodos o manejadores de eventos del mismo. Estó es, si haces algo como:
Te podría traer problemas posteriores. Si quieres garantizar que un formulario se destruye al cerrarlo una de las formas de lograrlo es el evento OnClose:
Saludos... |
sigo con el tema...
coloco frmbalance.free frmbalance.nil y me sale stack overflow :confused::confused::confused: |
Cita:
Saludos...:) |
Hola...
De seguro está poniendo ese código en el evento OnDestroy del formulario en cuestión... Saludos... |
La franja horaria es GMT +2. Ahora son las 08:22:09. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi