Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Extraer datos de un tlist (https://www.clubdelphi.com/foros/showthread.php?t=50456)

blueicaro 18-11-2007 22:32:49

Extraer datos de un tlist
 
Hola, tengo una estructura, como sigue
Código Delphi [-]
Type TComun = Record
  Nombre : String;  
  Tarea   : String; 
  Modulo : String;  
  Rutina : String;  
  Tipo   : String;  
  Scope  : String;  
end;
(...)
Comun : TComun

Cargo datos en comun, por ejemplo:
Código Delphi [-]
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í:

Código Delphi [-]
Comun := TComun(Milista[1]);

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

blueicaro 18-11-2007 23:05:28

Ahys
 
Bueno, Dec, no metes la pata, porque aportas idea.
Pero el compilador se ha reído de mi de nuevo
Y me dice:
Cita:

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:
Código Delphi [-]
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,

Cita:

Empezado por blueicaro
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.
Código 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.


La franja horaria es GMT +2. Ahora son las 09:00:12.

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