Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Se borran los elementos de la coleccion (https://www.clubdelphi.com/foros/showthread.php?t=35909)

jorllazo 26-09-2006 11:36:39

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.

maeyanes 26-09-2006 15:46:39

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...

roman 26-09-2006 17:00:59

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

maeyanes 26-09-2006 17:06:32

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...

roman 26-09-2006 17:10:29

¡Oh! Tienes toda la razón. Debí haberme fijado con más atención.

// Saludos

jorllazo 26-09-2006 21:19:45

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 21:10:09.

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