PDA

Ver la Versión Completa : Extraer datos de un tlist


blueicaro
18-11-2007, 22:32:49
Hola, tengo una estructura, como sigue

Type TComun = Record
Nombre : String;
Tarea : String;
Modulo : String;
Rutina : String;
Tipo : String;
Scope : String;
end;
(...)
Comun : TComun


Cargo datos en comun, por ejemplo:
Comun.Nombre :='Hola';
Comun.Tarea := 'MiTarea'
(...)
Milista.Add(@Comun)
Pero como recupero los datos, ya que esta línea me da error:
Comun := Milista[1];
Me dice que TComun es incompatible con Pointer
Gracias por su tiempo
/BLueIcaro

dec
18-11-2007, 22:34:53
Hola,

Digamos que el compilador no sabe que "Milista[1]" es del tipo "TComun", así que tienes que ayudarle un poquito, haciendo un "cast" de dicha variable, es decir, para que el asunto quede tal que así:


Comun := TComun(Milista[1]);


Vamos... no sé si estoy metiendo la pata...

blueicaro
18-11-2007, 23:05:28
Bueno, Dec, no metes la pata, porque aportas idea.
Pero el compilador se ha reído de mi de nuevo
Y me dice:
Invalid type cast

/BLueIcar

bpesoj
18-11-2007, 23:28:55
Hola,
Un TList es una colección de punteros, de manera que cada elemento debe ser un puntero:

var
elemento:^TComun;
nombre:String;
begin
elemento:=MyLista[0]; // saca el primer elemento de la lista...
nombre:=elemento^.nombre;
....
....
end;



Espero te sirva.

dec
18-11-2007, 23:34:30
Hola,


Bueno, Dec, no metes la pata, porque aportas idea.
Pero el compilador se ha reído de mi de nuevo


Se agradece. Pero, es que me lo temía... :) A ver si lo que te comenta el compañero te apaña. :)

Lepe
18-11-2007, 23:42:31
¿asignaciones de registro así por la cara?

Eso siempre lo confundo, no sé si es una asignación de punteros, o delphi hace una copia entera de la memoria :D.

Yo te diría que usaras un TObjectList, y tu registro lo convirtieras en un TObject, es mucho más fácil de usar y parecido a delphi.

Type TComun = Class(TObject)
public
Nombre : String;
Tarea : String;
Modulo : String;
Rutina : String;
Tipo : String;
Scope : String;
end;

Para crear la lista:
var
lista :TObjectList; // variable global del form.

procedure TForm1.Button1Click(Sender:TObject);
begin
lista := TObjectList.Create(True); // creamos la lista en memoria
// y le decimos que al liberar la lista, libere tambien todos los objetos que tenga.
end;

procedure TForm1.btnAnadirObjetoClick(sender:Tobject);
var c:Tcomun
begin
c:= TComun.Create;
c.nombre := edit1.text;
c.tarea := edit2.text;
...
lista.Add(c); // y ahora se añade a la lista.
end;

procedure TForm1.BtnBuscarElPrimero(Sender:Tobject);
var uno:Tcomun;
begin
if Assigned(lista) then // si la lista está creada
if Lista.Count > 0 then // si tiene objetos dentro
uno := TComun(lista[0]); // ahora si admite esto el compilador
// porque son asignaciones de punteros
// de hecho, no he creado el objeto "uno" con uno := Tcomun.create por
// esto mismo se sabe que son asignaciones de punteros


ShowMessage(uno.nombre);
end;

procedure TForm1.FormClose(....);
begin
// fumigar la lista y todos los objetos que tenga ;)
lista.free;
end;

Edito: ahora recien veo el comentario de bpesoj, totalmente válido y muy muy similar a lo que yo expongo (ya que también uso punteros pero camuflados).

Ya tienes 2 opciones para elegir ;)

Saludos

Al González
19-11-2007, 03:32:30
Creo que la solución con TObjectList sería la más recomendable en este caso.