Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ComboBox con Objeto String asignado a cada item (https://www.clubdelphi.com/foros/showthread.php?t=43678)

amadis 17-05-2007 17:06:00

ComboBox con Objeto String asignado a cada item
 
He ligado un objeto string a cada item de un combo pero al momento de recuperarlo recupera PEDAZOS de cadenas escritas en el codigo del form y a vees recupera lo que corresponde para los items.

Si lo hago con Integer funciona bien pero necesito datos tipo String.

Código Delphi [-]

// carga de valores al combo
while not Table1.Eof do
  begin
   ComboBox1.Items.AddObject(Table1campo1.Value , TObject(Table1campo2.AsString));  {para enteros aquí pongo .AsInteger}
   Table1.Next;
  end;

// recuperacion de los valores
edit1.text := string(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
{para recuperar un entero en lugar de string(Tobject) pongo integer(Tobject)}

El codigo re recuperación lo uso en OnChange del combo para que cargue el valor que corresponde a cada item en un Edit. Y para algunos lo hace bien y para la mayoria carga parte de cadenas del codigo fuente.

¿se puede hacer lo que quiero? ¿Es problema de la conversion del OBJETO a String?

Gracias

Lepe 17-05-2007 20:13:40

Con un String no se puede realizar tan rápido la cosa.

Un integer ocupa 2 bytes en memoria, exactamente lo mismo que un puntero a un objeto, de ahí que se pueda guardar el integer sin problema alguno.

Un string, es un puntero a memoria donde se guardará la cadena. Como no estas reservando memoria, estas escribiendo en una zona de memoria que no te pertenece. Que algunas veces recuperes parte de la cadena... es solo suerte, deberías recibir un Access Violation al asignar o recuperar la cadena de texto.

Soluciones hay muchas, pero creo que la más cómoda, es crearte tu propio objeto:
Código Delphi [-]

TCliente = Class(TObject);
public
  Nombre:string
  Facturado:Currency
end;


// carga de valores al combo
var C:TCliente;
while not Table1.Eof do
  begin
   C := TCliente.Create;
   C.Nombre := Table1campo2.AsString;
   C.Facturado := Table1campo1.Value;

   ComboBox1.Items.AddObject(Table1Campo1.Value , C);
   Table1.Next;
  end;

// recuperacion de los valores
edit1.text := TCliente(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Nombre;


//Antes de cerrar el Form, (o de vaciar el contenido del combo) tienes que liberar los objetos creados:
 For I:= combo.items.count-1 downto 0 do
   TCliente(Combo.items.objects[i]).Free;
He añadido el campo "Facturado" como mero ejemplo de que puedes guardar más cosas en el objeto.

Saludos.

amadis 17-05-2007 20:20:22

Muchas Gracias
 
Su puse que sería algo de eso!

Y estaba armando algo como tu ejemplo tomando como base otros hilos donde creaban un objeto Provincia!

Gracias!


La franja horaria es GMT +2. Ahora son las 13:11:39.

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