Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-09-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
Se borran los elementos de la coleccion

Hola Amigos.
Tengo este codigo :
Código Delphi [-]
procedure TfrmContacts.btnSaveAddressClick(Sender: TObject);
var
  oAdd: TAddress;
  ind : integer;
begin
  ind := lstAddresses.ItemIndex ;
  if oPerson.Addresses.Count > 0 then
  begin
    oAdd := oPerson.Addresses.Item[ind];
    with oAdd do
    begin
        street:= edtStreet.Text;
        postalCode := edtPostalCode.Text;
        city := cboCity.Text;
        province := cboProvince.Text;
        country := cboCountry.Text;
        save;
    end;
    oAdd.Free;
  end;
end;

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
Código Delphi [-]
            oAdd.free
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.
__________________
Gracias de Antemano
Responder Con Cita
  #2  
Antiguo 26-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #3  
Antiguo 26-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 26-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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:

Código Delphi [-]
destructor TCollectionItem.Destroy;
begin
  SetCollection(nil);
  inherited Destroy;
end;

procedure TCollectionItem.SetCollection(Value: TCollection);
begin
  if FCollection <> Value then
  begin
    if FCollection <> nil then FCollection.RemoveItem(Self);
    if Value <> nil then Value.InsertItem(Self);
  end;
end;

Ahora, si está usando un TList o un TListObject, entonces si, el comportamiento sería el que mencionas...


Saludos...
Responder Con Cita
  #5  
Antiguo 26-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Oh! Tienes toda la razón. Debí haberme fijado con más atención.

// Saludos
Responder Con Cita
  #6  
Antiguo 26-09-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
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.
__________________
Gracias de Antemano
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Google y bibliotecas crean primera colección de libros online vtdeleon Noticias 0 04-11-2005 04:36:58
Componentes con colección soul6301 Varios 16 29-07-2004 21:12:53
Registro que se borran en paradox pdmaltese Tablas planas 3 16-11-2003 10:03:27
Iterar por una coleccion de Formularios Michel Varios 1 28-08-2003 17:39:14
Coleccion de Controles... craven OOP 2 02-06-2003 17:09:33


La franja horaria es GMT +2. Ahora son las 05:25:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi