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 01-03-2009
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Unhappy 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.

Última edición por Bauhaus1975 fecha: 01-03-2009 a las 12:14:09.
Responder Con Cita
  #2  
Antiguo 01-03-2009
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
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.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 01-03-2009
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
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.
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
Extraer datos de un tlist blueicaro OOP 6 19-11-2007 03:32:30
como mantener coneccion a IB ? martita Conexión con bases de datos 2 27-07-2005 01:06:02
Mantener actualizadas dos bases de datos mar646 Firebird e Interbase 0 05-01-2005 16:52:33
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51
Como guardar una array en una base datos? ciscu Varios 3 11-02-2004 09:27:49


La franja horaria es GMT +2. Ahora son las 10:45:25.


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