Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Manejar un TList (https://www.clubdelphi.com/foros/showthread.php?t=95330)

Ralevi 11-08-2021 22:23:29

Manejar un TList
 
Buenas, sigo experimentando. :)

Creo un form con varios Label y SpinBox, y uso Tlist para manejarlos.

Este es mas o menos el sistema:
Código Delphi [-]
   //----------------------------------------------------------------------------------------------------------------
   procedure ElProgramaX.FormCreate(Sender: TObject);

   Var
   Lista1,Lista2:Tlist;  
   Espin:TSpinBox;
   etiqueta:tlabel;
   x,idx1,idx2:integer;

   begin

   Lista1:=Tlist.Create;

   idx1:=Lista1.Add(label1);
   /...  Añado todos los Label 
   idx1:=Lista1.Add(labe20);

   Lista2:=Tlist.Create;

   idx2:=Lista2.add(SpinBox1);
   // ... Añado los TSpinBox
   idx2:=Lista2.add(SpinBox20);

   //Cargo Los Label desde un  Memo
   for x := 0 to MEMO1.Lines.Count-1 do
     begin
     Etiqueta:=Lista1.items[x];
     Etiqueta.Text:=MEMO1.LINES[X];
     end;
 
   // Aqui asigne los valores solo para comprobar el orden y que funcionaba ;)
   for x := 0 to MEMO1.Lines.Count-1 do
     begin
     Espin:=Lista2.items[x];
     Espin.value:=x;
     end;

   end;
   //----------------------------------------------------------------------------------------------------------------
En principio funciona bien, las consultas son:

-La estoy liando y hay métodos mas sencillos??

-La variable idx tiene que ser diferente para cada List o si le asigno valor 0 antes de asignar la segunda valdría?

-Como todas las variables se declaran en el procedimiento FormCreate no se podrá acceder a los datos desde otra parte del código. ¿Se podria declarar en un procedimiento externo?

Gracias anticipadas.

Neftali [Germán.Estévez] 12-08-2021 09:34:07

Hay varias cosas a comentar, sin saber muy bien para qué quieres utilizar la estructura, sí que hay cosas que puedes mejorar.


Se me ocurre que puedes usar listas específicas (usando genéricos TList<T>):
Código:

var
  listaLabels:TList<TLabel>;
  listaSpinBox:TList<TSpinBox>;
begin
  listaLabels := TList<TLabel>.Create;
  listaSpinBox := TList<TSpinBox>.Create;


Cita:

Empezado por Ralevi (Mensaje 542318)
-Como todas las variables se declaran en el procedimiento FormCreate no se podrá acceder a los datos desde otra parte del código. ¿Se podria declarar en un procedimiento externo?


Los elementos (variables, objetos,...) que necesites utilizar desde otros procedimientos del pformulario, puedes definirlos en la parte privada de la clase. Al final de la clase del formulario tienes esto:
Código Delphi [-]
    ....

    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Lo que definas en el private sólo es accesible desde dentro de esta unit, lo que definas en la parte public será accesible desde otras units.


Para añadir los Labels y los Spinbox a las listas puedes usar un bucle FOR y utilizar el método FindComponent que te permite acceder a un componente a partir del nombre.


Código Delphi [-]
var
  comp:Tcomponent;
  i:integer;
begin
  ...
  for i := 1 to 20 do begin
    comp := FindComponent('Label' + i.ToString);     // buscar el componente `pòr el nombre
    if Assigned(comp) then                                  // si lo ha encontrado....
      listaLabels.Add(TLabel(comp));                     // lo añade a la lista
  end;

En cuanto a lo que comentas de la variable idx, siplemente es la posición en que el elemento se añade a la lista. Como en este caso no te interesa esa información no hare falta ni que la asignes.
Código Delphi [-]
  Lista1.Add(Label1);
o 
  listaLabels.Add(TLabel(comp));

Si vas a usar un for para recorrer los componentes, puedes usar el mismo, incluso para asignar el texto también.
Algo así:

Código:

var
  i: Integer;
  comp:Tcomponent;
  listaLabels:TList<TLabel>;
  listaSpinBox:TList<TSpinBox>;
begin
  // Lista1 := Tlist.Create;
  listaLabels := TList<TLabel>.Create;
  listaSpinBox := TList<TSpinBox>.Create;

  for i := 1 to 20 do begin
    // Buscar el Label por nombre
    comp := FindComponent('Label' + i.ToString);
    // Si lo ha encontrado, lo añadimos a la lista...
    if Assigned(comp) then begin
      listaLabels.Add(TLabel(comp));
      // asiganr el texto del memo
      TLabel(comp).Text := Memo1.Lines[i];
    end;

    // Buscar el spinbox por nombre  (SpinBox1, SpinBox2, SpinBox3,...
    comp := FindComponent('SpinBox' + i.ToString);
    // Si lo ha encontrado, lo añadimos a la lista...
    if Assigned(comp) then
      listaSpinBox.Add(TSpinBox(comp));
  end;


Ralevi 12-08-2021 17:43:01

Muchas gracias por una respuesta tan extensa.

Voy a experimentar todo lo que me comentas, ale ya tengo entretenimiento para unas tardes ;)

Saludos


La franja horaria es GMT +2. Ahora son las 11:22:21.

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