![]() |
Se borran los elementos de la coleccion
Hola Amigos.
Tengo este codigo :
en donde oPerson.Addresses es una clase que deriva de TCollection y TAddress deriva de TCollectionItem, el caso es que la lista se carga de la BD salen 2 Items y todo lo demas ,hsta ahi perfecto, pero cuando realiza la Accion me borra el objeto de la Coleccion, es esto normal? No estoy muy acostumbrado a trabajar asi. liberando memoria y demas.,. el caso es que cada vez que pasa por ahi el codigo, me elimina un elemento de la lista. |
Así es, es normal que te desaparezca un objeto de tu colección al hacer un Free ya que lo estás liberando de la memoria y al hacer esto el mismo se elimina de la colección que lo contiene...
Solo elimina la línea oAdd.Free de tu código y verás que tu colección queda intacta. Saludos... |
Yo no estaría tan seguro de que sea un comportamiento normal. Casi me atrevo a asegurar que no es así. oAdd.Free ciertamente destruye el objeto pero no elimina la referencia de la lista; es decir, la lista debería tener el mismo número de elementos aunque uno de ellos ya no sea un objeto válido.
De cualquier forma, lo cierto es que el uso del Free sobra aquí. oAdd no se usa para construir un objeto sino simplemente para tener una referencia a uno ya existente: oPerson.Addresses.Item[ind]. Dicho de otra manera, oAdd y oPerson.Addresses.Item[ind] apuntan al mismo objeto. Si se destruye oAdd se destruye también oPerson.Addresses.Item[ind] (pues es el mismo) y dudo que tal sea la intención. // Saludos |
Bueno, al decir que son colecciones pensé que se refería a descendientes de TCollection y TCollectionItem, y si revisas el código de TCollectionItem.Destroy, verás que este se elimina de la collección que lo contiene al momento de destruirse, de ahí viene mi respuesta.
De Classes.pas:
Ahora, si está usando un TList o un TListObject, entonces si, el comportamiento sería el que mencionas... Saludos... |
¡Oh! Tienes toda la razón. Debí haberme fijado con más atención.
// Saludos |
Hola,
Probando me di cuenta que realmente lo elimina, por que como apunta roman se trata de referencia a memoria del mismo objeto con lo que el .free en este caso sobraria. Lo quite y ya se comporta del modo esperado. Gracias otra vez. con un poco de paciencia algun dia podre responder posts. |
La franja horaria es GMT +2. Ahora son las 07:11:21. |
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