Ir al contenido


Foto

Buscar item en combobox por clave


  • Por favor identifícate para responder
8 respuestas en este tema

#1 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 01 abril 2013 - 11:41

Hola amigos les planteo mi problema, Tengo en una bd con una tabla llamada cultivo que tiene los campos clave y nombre
la clave es string y el nombre tambien lo que me han dejado hacer es que en un combobox muestre los cultivos y una edit que ingrese la clave y automaticamente se seleccione en el combobox el cultivo correspondiente a esta clave lo he tratado de hacer pero aun no lo he logrado
este es el combo


delphi
  1. FDM.ZQtemp.SQL.Clear;
  2. FDM.ZQtemp.SQL.Text := 'Select * From cultivos';
  3. FDM.ZQtemp.Open;
  4.  
  5. while not FDM.ZQtemp.Eof do
  6. begin
  7.  
  8.   cbox_Cultivo.Items.IndexOf(FDM.ZQtemp.Fields[0].Text);//Campo clave
  9.   cbox_Cultivo.Items.Add(FDM.ZQtemp.Fields[1].Text);//Campo cultivo
  10.  
  11.   FDM.ZQtemp.Next;
  12. end;
  13. cbox_Cultivo.ItemIndex := 0;



Caja de texto



delphi
  1. cbox_Cultivo.IndexOf(edit_cultivo.Text);


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 abril 2013 - 12:02

Para ello mejor utiliza el DBLookUpComboBox:

http://www.delphiacc...lookupcombobox/

Saludos.
  • 0

#3 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 01 abril 2013 - 01:11

Amigo no puedo usar ese componente ya lo habia puesto pero resulta que por cuestion de vista quieren hacerlo como lo explique  si me ayudas a resolverlo te lo agradeceria hermano
bendiciones
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 01 abril 2013 - 01:52

Saludos.

No probé el código, simplemente se me ocurrió la idea:


delphi
  1. FDM.ZQtemp.SQL.Clear;
  2. FDM.ZQtemp.SQL.Text := 'Select * From cultivos';
  3. FDM.ZQtemp.Open;
  4.  
  5. while not FDM.ZQtemp.Eof do
  6. begin
  7.   cbox_Cultivo.Items.AddObject(FDM.ZQtemp.Fields[1].Text, TObject(FDM.ZQtemp.Fields[0].Text));
  8.   FDM.ZQtemp.Next;
  9. end;
  10. cbox_Cultivo.ItemIndex := 0;



Luego en tu caja:


delphi
  1. var lClave: string;
  2. lClave := cbox_Cultivo.Items.Objects[cbox_Cultivo.ItemIndex] as string;



Debería de funcionar o estar cerca de hacerlo.

Ojo, estoy haciendo un "casteo" a sabiendas de que almacenas en tu clave valor string.

Otra manera si te fallara, es crear una clase que tenga una propiedad tipo string y hacer la asignación a la propiedad. Con dicha clase ponerla como segundo parámetro de AddObject.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 abril 2013 - 02:14

Es que utilizando el Simple ComboBox deberás realizar más código utilizando objetos para la inserción y acceso a la clave, por ejemplo:



delphi
  1.     type
  2.       TmiObjeto = class(TObject)
  3.         sClave: String;
  4.       end;
  5.    
  6.     procedure TForm1.AgregarLlave(Clave, Texto: String);
  7.     var
  8.       obj : TmiObjeto;
  9.     begin
  10.       obj := TmiObjeto.Create;
  11.       obj.sClave := Clave;
  12.       ComboBox1.Items.AddObject(Texto, TmiObjeto(obj));
  13.     end;



Su uso sería:



delphi
  1. AgregarLlave(FDM.ZQtemp.Fields[0].Text, FDM.ZQtemp.Fields[1].Text);



Sólo faltaría obtener el Objeto Clave, Pruebalo y nos comentas, OJO: lo hice al vuelo, puede haber errores.

Saludos.

EDITO: No vi el hilo de Rolphy  :p
  • 0

#6 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 01 abril 2013 - 02:23

Saludos, tal como comenta Rolphy Reyes, puedes crear una clase donde almacenes los valores de la base de datos para luego guardar el objecto en el combobox con el método AddItem o AddObject. Te doy un ejemplo:



delphi
  1. { clase para guardar los datos }
  2. type
  3.   TCultivo = class(TObject)
  4.   private
  5.     FClave: string;
  6.     FNombre: string;
  7.   public
  8.     property Clave: string read FClave write FClave;
  9.     property Nombre: string read FNombre write FNombre;
  10.   end;



Luego en donde recorres la tabla colocas el siguiente código:



delphi
  1. var
  2.   Cultivo: TCultivo;
  3.   //...
  4. begin
  5. FDM.ZQtemp.SQL.Clear;
  6. FDM.ZQtemp.SQL.Text := 'Select * From cultivos';
  7. FDM.ZQtemp.Open;
  8.  
  9. while not FDM.ZQtemp.Eof do
  10. begin
  11.   { Creamos la instancia }
  12.   Cultivo := TCultivo.Create;
  13.   Cultivo.Clave := FDM.ZQtemp.Fields[0].Text;
  14.   Cultivo.Nombre := FDM.ZQtemp.Fields[1].Text;
  15.  
  16.   cbox_Cultivo.Items.AddItem(Cultivo.Nombre, Cultivo);
  17.   FDM.ZQtemp.Next;
  18. end;
  19. cbox_Cultivo.ItemIndex := 0;



Finalmente puedes acceder a los atributos de la clase de la siguiente forma:


delphi
  1. var
  2.   Clave: string;
  3.   Nombre: string;
  4. begin
  5.   Clave := TCultivo(cbox_Cultivo.Items.Objects[cbox_Cultivo.ItemIndex]).Clave;
  6.   Nombre := TCultivo(cbox_Cultivo.Items.Objects[cbox_Cultivo.ItemIndex]).Nombre;
  7.   //...



Y si quieres que al introducir la clave en una caja de texto se ubique directamente en el comobox, vas a tener que recorrer los items y comparar los valores:


delphi
  1. var
  2.   I: Integer;
  3. begin
  4.   for I := 0 to cbox_Cultivo.Items.Count -1 do
  5.     if TCultivo(cbox_Cultivo.Items.Objects[I]).Clave = edit_cultivo.Text then
  6.     begin
  7.       cbox_Cultivo.ItemIndex := I;
  8.       break;
  9.     end;



El código lo hice de memoria y no lo he probado por lo que algo se me pudo escapar ;)
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 abril 2013 - 08:31

Hola,
Para agregar a las palabras de los compañeros, no está demás un .First antes de entrar al bucle  ;)

Saludos,
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 abril 2013 - 01:29

Buenas

Yo te voy a dar 2 ideas más.

1.- Un combo a dos columnas, una para el ID y otra para la Descripción. Puedes hacer que al desplegar el combo se vean las 2 columnas, pero que por el ancho del combo sólo se vea una
  • Ejemplo de controlar anchura aquí.
  • Ejemplo de múltiples columnas en un combo aquí.

2.- La segunda opción es más sencilla. Dado que tienes en el combo las descripciones y pones en un TEdit el Id, lo que tienes que hacer es en el OnChange del TEdit hacer una consulta sobre la tabla sencilla

select descripcion from tabla where id = :id


y con el resultado de la sentencia hacer un IndexOf sobre la propiedad Items del TComboBox.

Ahora ya tienes 3 formas de hacer tu trabajo, escoge la que más te guste ;-)

Nos leemos

PD: Delphius, si al First que te refieres es al de "while not FDM.ZQtemp.Eof do", éste no sería necesario dado que la sentencia justo anterior es un Open del propio dataset ;-)
  • 0

#9 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 02 abril 2013 - 01:46

Bueno muchas gracias por sus respuestas lo logre resolver se oye algo ilogico pero asi le gusto al usuario
lo que hize fue poner 2 TSCombobox , uno para la clave y el otro para el nombre y mediante el itemindex boy seleccionando cada uno bueno muchas gracias por sus respuestas Dios los bendice
  • 0




IP.Board spam blocked by CleanTalk.