Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Uso del Objeto TList (https://www.clubdelphi.com/foros/showthread.php?t=15583)

aromero 28-10-2004 01:54:53

Uso del Objeto TList
 
Buenas noches,

alguien me podría explicar como manipulo los objetos insertados en un TList. Yo pienso que
1º creo un objeto del tipo insertado en la lista
      • OBJ.create
2º asigno el objeto insertado en el TList al creado en 1
      • OBJ := lista.items[i]
3º lo modifico con un metodo especifico del objeto
    • OBJ.modifica(elemento)
4º ¿y ahora...?

Un saludo a todos

Neftali [Germán.Estévez] 28-10-2004 10:24:00

Cita:

Empezado por aromero
...alguien me podría explicar como manipulo los objetos insertados en un TList....

A ver si con un ejemplillo te aclaras:

Código Delphi [-]
var
  L:TList;
  Edit:TEdit;
  Index:Integer;
  E:TEdit;
begin
  // Crear la lista
  L := TList.Create();
  // Crear un objeto (un edit, por ejemplo)
  Edit := TEdit.Create(Self);
  Edit.Name := 'Edit1';
  // Añadirlo a la lista
  Index := L.Add(Edit);
  // Crear un segundo objeto
  Edit := TEdit.Create(Self);
  Edit.Name := 'Edit2';
  // Añadirlo a la lista
  Index := L.Add(Edit);
  // Obtener el primer objeto
  E := L.Items[0];
  E.Text := 'primer edit';
  // Objetener el segundo
  E := L.Items[1];
  E.Text := 'este es el segundo edit';
 
  // Para destruir yo utilizo un for para destruir todos los 
  // objetos y luego libero la lista
  ...
Si hay alguna parte que no entiendes, ya dirás...

roman 28-10-2004 15:55:16

Nada más agregar a lo que bien describe Neftali, que también existe el objeto TObjectList para manejar listas de objetos. En un ObjectList construido con

OL := TObject.List(true);
no hay necesidad de destruir cada uno de los objetos almacenados ya que la lista misma lo hace cuando ella misma se destruye.

// Saludos

aromero 29-10-2004 00:44:31

Ya lo pillo, pero ¿que hago si quiero modificar las propiedades de uno de ellos?

Neftali [Germán.Estévez] 29-10-2004 09:57:00

Obtienes el elemento que deses y lo guardas en una variable que sea del mismo tipo del elemento que has guardado:
En realidad esa variable apunta al elemento que hay en la lista guardado.

Código Delphi [-]
var
  E:TEdit
begin
  ...
 
  // Obtener el primer objeto
  E := L.Items[0];
  E.Text := 'primer edit';

  // Objetener el segundo
  E := L.Items[1];
  E.Text := 'este es el segundo edit';

  // obtener el objeto i
  E := L.Items[i];
  E.Text := 'este es el elemento i';
  // CUIDADO LA i NO PUEDER SER MAYOR o IGUAL que L.Count
  // (L.Count es el número de elementos de la lista)

Y luego modificas el elemento:

Código Delphi [-]
  ...
  E.Text := 'nuevo texto del elemento';
  // Cam,biamos el Left y Top
  E.Left := 100;
  E.Top := 200;
  ...

Lepe 29-10-2004 12:54:52

Metiendome donde no me llaman, considero oportuno que digas el objeto de que tipo es, ya que los ejemplos son con Tedits, pero si es un objeto personalizado, podría haber otras alternativas, me explico:

Código Delphi [-]
type  Tmio = class (tobject)
private
  FTexto : string;
  procedure SetValor(const Value:string);
public
  property Texto:string read FTexto write SetValor default '< cadena por defecto >';
end;

implementation

 procedure Tmio.SetValor(const Value:string);
begin
   if value <> FTexto then
   begin
      FTexto := Value + ' añado esta cadena automaticamente';
   end;
end;

De esta forma, al crear el objeto, la cadena texto tiene un valor distinto a cadena vacia, y cuando se modifique la propiedad Texto del objeto, automaticamente se puede hacer otras cosas, sin tener que llamar al método Modifica.

Puede que te sirva, o puede que no, sin saber lo que estas haciendo es imposible contestarte correctamente.

Saludos y perdon si no viene al tema.

aromero 29-10-2004 23:45:47

Perdón, no me había dado cuenta. La definición del objeto es

TSuelo = class (TObject)
public
procedure Modificar_Color (c :TColor);
procedure Modificar_Asignacion (b : Boolean);
private
Color : TColor;
Asignado : Boolean;
end;

Gracias

Lepe 01-11-2004 13:47:15

Creo que el ejemplo que puse te viene "al pelo", Si quieres realizar tareas adicionales al modificar el Color o Asignación.

Código Delphi [-]
type  Tmio = class (tobject)
private
 FColor :Tcolor;
public
  property Color :TColor read FColor write FColor default clblack;
end;

Con esto simplemente estas añadiento la posibilidad de tener inicializado Color al crear el objeto, amén de ser más legible el código.

En función de lo que desees, puedes usar éste ejemplo, el ejemplo anterior, o incluso una mezcla de ambos. Te toca a tí trabajarlo un poquito, que realmente es como se aprende, y si tienes alguna duda, ya sabes que aquí estamos.

Saludos

david duarte 19-10-2005 22:46:04

Hola!!!

Tengo un problema, necesito crear un arreglo bidimensional para guardar dos datos en ellos, estos datos son, un dato string y el otro entero, entonces lo que hago es lo siguiente:


Primero declaro mi clase Tposicion
Código Delphi [-]
type Tposicion = class(TObject)
Public
  analisis : String;
  izq : Integer;
end;

postriormente hago mi procedimiento de crear arreglo
Código Delphi [-]
procedure CreaArreglo();
begin
  Arreglo := TObjectList.Create(True);
end;

Despues mi procedimiento de CreaPosicion
Código Delphi [-]
procedure CreaPosicion(an : string; posizq : Integer );
var
  a: Tposicion;
Begin
  a := TPosicion.Create;
  a.analisis := an;
  a.izq := posizq;
  Arreglo.Add(a); --> se supone que aqui lo añade al arreglo
end;

y aqui lo mando llamar
Código Delphi [-]
CreaPosicion(modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName,izq);

pero en el Arreglo (TObjectiList), no guarda nada, cuando recorro el arreglo, me aparece, pura basura, alguien tiene alguna sugerencia???

Ya lei algunos hilos que estan por este foro y a partir de ahi construi estos, pero no se que tiene mal

Gracias

Cómo te sientes hoy??

Lepe 19-10-2005 23:52:19

Para ser concisos, no se trata de un arreglo, sino de una lista de objetos Tposicion.

Seguro que el tema está en como recorres el TobjectList, en concreto sería así:

Código Delphi [-]
for i:=0 to arreglo.count -1 do
  showMessage( TPosicion(arreglo.objects[i]).analisis + '  izq: '+ 
                inttostr(TPosicion(arreglo.objects[i]).izq));

si solo encuentras basura, es porque no encuentras ni la propiedad analisis ni el izq.

Recuerda que un TobjectList es una lista de TObject, por tanto no puede saber que en realidad es un TPosicion. Cuando accedes con arreglo.objects[i], lo que te devuelve es un TObject, donde por supuesto no existe las propiedades izq y analisis.

el añadir TPosicion( ... ) es lo que se conoce como "Cast" (forzado de tipos), le estamos diciendo al compilador que no trate a ese elemento como un TObject, sino como un TPosicion.

Casi seguro que es esto ;).

saludos

david duarte 21-10-2005 17:30:11

Gracias Lepe

Pensandolo bien, creo que no me combiene usar el arreglo de ObjectList, simplemente necesito guardar el analisis y la posicion(left), y no es necesario tener un arreglo de objetos, prefiero bien usar un stringgrid, No se que me convenga mas, lo que voy a hacer es crearlo en tiempo de ejecucion. Ya que lo que quiero es que no me ocupe mucha memoria, asi si lo creo en tiempo de ejecucion, al momento de cerrar la forma, se liberara la memoria que se asigno para este.

Gracias

Cómo te sientes hoy?


La franja horaria es GMT +2. Ahora son las 00:45:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi