![]() |
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... |
estuve leyendo mastering delphi
y en un ejemplo dice que para destruir un formulario basta con colocar en el evento Close action := caFree frmBalance := nil aqui.. en la pagina 359 entonces asi lo estaba haciendo desde un principio |
Liberar un objeto dentro de su propio destructor no tiene sentido. Si se llama al destructor es porque el objeto ya está siendo liberado.
// Saludos |
Cita:
|
Hola oscarac.
Me gusta más:
Agrego un Koan de Ian Marteens que leí hace un buen tiempo y me pareció muy interesante: ¿Hay vida después de la muerte?. Un saludo. |
Cita:
Cita:
Lo que haces vos esta bien, porque vos abris las ventanas con Show, entonces las liberas cuando se cierran en el OnClose (con action:=caFree) Lo que NO podes hacer es cambiar la instruccion action:=caFree; por frmBalance.Free; porque ahi si te va a dar error. Cuando se usa ShowModal para mostrar las ventanas, la siguiente linea al ShowModal no se ejecuta hasta que se cierra la ventana, entonces se hace la liberacion en la linea siguiente:
por ultimo, de la ayuda de Delphi sobre el metodo Free... Cita:
Saludos |
Yo tambien uso el modelo de ecfisa, pero cabe destacar que tambien se puede hacerlo todo en el mismo evento OnClose de la forma siguiente:
EDITO: Viendo éste asunto me pregunto :rolleyes: sino sería util un método ReleaseAndNil?? ;) Saludos...:) |
Cita:
es una mala práctica. Una clase no debería hacer referencia a una instancia en particular. Yo sé que esto es muy común pero no debería hacerse de esta manera. De entrada, no debería usarse la variable Form2 que el IDE crea en automático por la simple razón de que no es bueno usar variables globales. Si el formulario principal requiere una instancia de Form2 y necesita tenerla reservada, entonces se declara una variable de tipo TForm2 (o, mejor, de tipo TForm) como campo privado. // Saludos |
Hola
Cita:
Saludos... |
quiza no leyeron un mensaje anterior donde preguntaba cual es la diferencia entre
|
Cita:
Pregunta nueva, hilo nuevo. // Saludos |
Cita:
|
Cita:
// Saludos |
Cita:
Saludos...:) |
Cita:
1. Quien se pone nulo no es el objeto sino una referencia al objeto. Diferencia sutil pero importante. Puedes tener múltiples referencias a un mismo objeto, así que, ¿cuál de ellas es la que se pondría en nulo al momento de destruir el objeto? Eso es algo que puede decidir quien creó al objeto, mas no el objeto en sí. 2. Como no sea una suerte de patrón singleton, por lo general puedes tener varias instancias de una misma clase. Aún en el caso de formularios que en un determinado contexto quieres abrir una sola vez. Entonces, ¿a cuál de estas instancias se debe referir el destructor de la clase? Por otra parte, Cita:
Yo diría, en una especie de resumen, que las referencias a un objeto son entidades ajenas a la clase del objeto (y al objeto mismo). // Saludos |
Cita:
Cita:
Si por ejemplo instanciaramos un objeto de la clase "TChildForm" de la siguiente forma: Para que tu solucion funcione tambien con "OtroForm" deberiamos modifcar el método Notification de la siguiente forma: Eso quiere decir que por cada nueva referencia tengo que aumentar código al método Notification..y eso no es ideal amigo seamos realista.;) En otras palabras estamos restringidos a crear un objeto solo atraves de la variable "ChildForm", si quisieramos que la cosa siga funcionando y evitar agregar más código; y..pues es practicamente lo mismo que hacer uso de la varible global que gerera delphi, asi que por ese lado no hay diferencia.;) Bueno... para no hacerla muy larga la cuestion...pues voy a volver a hacer la pregunta: ¿Es posible implementar una solucion que esté dentro de la misma clase sin utilizar alguna variable en sí? es decir al momento de Destruir(Action:=caFree;) el Objeto hacer que la referencia del objeto sea nula(nil)??:confused: ¿será posible eso?:confused: |
Dices esto:
Cita:
Cita:
// Saludos |
Cita:
Por favor responde la pregunta...sin vueltas... |
Hola...
Cita:
Saludos... |
Cita:
|
Cita:
// Saludos |
| La franja horaria es GMT +2. Ahora son las 10:47:10. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi