Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Array de TList. ¿Cómo mantener datos? (https://www.clubdelphi.com/foros/showthread.php?t=63754)

Bauhaus1975 01-03-2009 12:08:28

Array de TList. ¿Cómo mantener datos?
 
Hola de nuevo compañeros.
Tengo un problema para mantener los datos en un 'array of TList'. Veamos los tipos y variables para empezar:

Código Delphi [-]
type
    TLista  = TList;
    TTabla = array of TLista;
 
    PItem = ^TItem;
    TItem = Record
               campo1:double;
               campo2:double;
     end;
 
var
    lista : TLista;
    tabla : TTabla;

El problema se da a la hora de añadir datos, primero formamos la lista añadiendo items a ella. Y el bucle principal mete cada lista en tabla[i]. Si reseteamos la lista previamente a introducir sus items, los valores antes introducidos en la tabla se pierden.

Código Delphi [-]
// Ponemos un ejemplo para introducir los datos
var
    item : PItem;
begin
 
SetLength(tabla,0);
lista:=TList.Create();
// La tabla tiene n listas
for iLista:=1 to NLista do
    // Reseteamos la lista
    lista.Clear(); // *** Al ejecutar este sentencia perdemos todos lasl istas antes introducidas 
    // NOTA: según he visto, esto no libera la memoria consumida por los items, pero omitimos el paso de liberar.
    // Cada lista tiene nItems, los añadimos
    for iItem:=1 to NItem do
        begin
        NEW(item); 
        //item.campo1:= (cualquier valor)
        lista.Add(item);
    end;
    // Añadimos la lista a la tabla
   SetLength(tabla,Length(tabla)+1);
   tabla[Length(tabla)-1] := lista;
end;
// Cada vez que se ejecuta el 'lista.Clear();' se pierde lo antes almacenado en tabla[].

¿Cuál puede ser la solución? ¿tengo que crear una clase que contenga al tipo TList, para hacer un NEW(lista) en cada iteración?

Gracias y un saludo.

DarkMan 01-03-2009 18:39:06

Los objetos en delphi realmente son punteros. Esto quiere decir que cuando realizas
Código Delphi [-]
tabla[Length(tabla)-1] := lista;
estas apuntando con las dos variables a la misma posición en memoria, y en consecuencia al liberar uno, estas liberando el otro.

La solución es no borrar los items de lista, sino crear una nueva lista:
Código Delphi [-]
// Cada vez que se ejecuta el 'lista.Clear();' se pierde lo antes almacenado en tabla[].
 Lista:= TLista.create;
Espero que lo hayas entendido,

un saludo.

Bauhaus1975 01-03-2009 21:22:24

Hola DarkMan,
Efectivamente, tan simple como que no caí en ello.
Parece que así cada nueva lista creada se mantiene en la tabla. Ahora tendré que tener en cuenta un método para liberar de memoria todos los items (recorriendo toda la estructura).

Muchas gracias por la ayuda y un saludo.


La franja horaria es GMT +2. Ahora son las 23:53:12.

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