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
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.
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. :)
¿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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.