PDA

Ver la Versión Completa : Hacer que un DBLookupComboBox funcione como un ComboBox, o viceversa


wull
21-08-2012, 19:38:13
Hola, ando por aca molestando de nuevo. Ahora mi consulta tiene que ver con el uso del componente DBLookupComoBox. Antes de utiizar este componente usa un combobox normal, pero como tuve que accesar a base de datos empece a utilizar el BDCombobox. La cosa es que no puedo repetir algunas funciones que hacia con el combobox normal; por ejemplo quiero que al iniciar el programa en el DBLookupComoBox se muestra un texto como “Elija su opción” lo cual hacia en el combobox con este código nombredelcombo.Text:= “Elija su opción”; pero esto no funciona en el DBcombo… ya busque en el foro y me encontré con esto
DBLookupComboBox.KeyValue := Query1.FieldByName('codigo').AsInteger;
Pero resulta que a mi no me aparece la propiedad FieldByName, además de que , según entendí, esto solo me ayuda a mostrar un valor por defecto y yo quiero algo diferente.:eek:
Por eso quiero pedirles que me ayuden a lograr que en el DBLookupComoBox se muestra la leyenda “elija su opción” al momento de ejecutar el programa, o bien que me orienten como puedo hacer para tener un combobox normal pero enlazado a una base datos:confused:

ecfisa
21-08-2012, 20:05:25
Hola wull.


quiero que al iniciar el programa en el DBLookupComoBox se muestra un texto como “Elija su opción”

No es posible de esa forma, para que lo fuera, en el TDataSet asociado, tendría que existir un registro que contuviera ese texto.


o bien que me orienten como puedo hacer para tener un combobox normal pero enlazado a una base datos

Tampoco es posible enlazar un TComboBox a una base de datos, pero podrías hacer algo como:

...
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Clear;
with Query1 do
begin
Open;
while not Eof do
begin
ComboBox1.AddItem(FieldByName('CAMPO_X').AsString, // campo que se muestra
TObject(FieldByName('ID').AsInteger)); // campo clave
Next;
end;
First;
end;
ComboBox1.Text := 'Elija su opción';
end;

...

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex <> -1 then
Query1.Locate('ID', Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]),[]);
end;
...


Saludos.

luisgutierrezb
21-08-2012, 20:59:58
Bueno, no se que componentes tengas o dispongas, pero el dblookupcombo de los jedi, le puedes poner un texto de elija su opción o lo que quieras... y también esta ligado a la BD...

roman
21-08-2012, 21:10:47
No es posible de esa forma, para que lo fuera, en el TDataSet asociado, tendría que existir un registro que contuviera ese texto.


Y mira que yo he tomado esa opción en ocasiones. Normalmente mis llaves primarias son campos enteros numerdos desde 1. Así que aprovecho el 0 para poner un texto así.

De todas maneras, siempre queda la opción de poner un pequeño Label con la información requerida.

// Saludos

wull
22-08-2012, 03:33:38
Ufff vaya eficacia y rapidez en las respuestas. Me he pasado el día leyendo acerca de los DBLookupComboBox, y ya he comprendido lo que mencionan en sus comentarios. Ya he analizado las propuestas de ecfisa y estaba a punto de probar una de ellas, pero me tope con el componente BDComboBox... ahora mi duda es, puedo utilizar este componente para lograr lo que quiero? más que nada me gustaria saber como funciona el DBComboBox ya leí un poco acerca de el, pero la verdad no entendí mucho... alguien me puede explicar si no es mucha molestia.

ecfisa
22-08-2012, 04:25:44
Hola wull.

Traducción de la ayuda de Delphi:

Utilice TDBComboBox para permitir a los usuarios cambiar el valor de un campo en el registro actual de un conjunto de datos ya sea mediante la selección de un elemento de una lista o escribiendo en el cuadro de edición de parte del control. El elemento seleccionado o el texto introducido se convierte en el nuevo valor del campo si la propiedad ReadOnly del cuadro combinado de base de datos es falsa. El cuadro combinado se puede personalizar para activar o desactivar escribiendo en el área de edición del control, para visualizar la lista como una lista desplegable o como una lista permanentemente visible, para ordenar los elementos de la lista, y así sucesivamente.

Es decir que usado solamente para elegir una opción, no hay grandes ventajas frente al TComboBox, ya que de todos modos tendrías que realizar la carga de los registros en su propiedad Items al inicio y además no dispondrás del evento OnChange al cambiar de ítem.

Por otro lado, reviendo el código que te sugerí, tal vez no sea necesario que almacenes el ID. Si sólo es a fin de posicionarte basta con que hagas:

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Clear;
with Query1 do
begin
Open;
while not Eof do
begin
ComboBox1.Iems.Add(FieldByName('CAMPO_X').AsString); // campo que se muestra
Next;
end;
First;
end;
ComboBox1.Text := 'Elija su opción';
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex <> -1 then
Query1.Locate('CAMPO_X', ComboBox1.Items[ComboBox1.ItemIndex],[]);
end;


Saludos. :)

wull
23-08-2012, 02:28:00
ecfisa muchas gracias por todo el tiempo que te tomas para contestar; ya estoy probando una solución en base a tu respuesta debido a lo cual me surgió otra duda, pero antes de preguntar voy a probar si me funciona primero... espero que sigas aquí por cualquier problema... de nuevo gracias.

wull
23-08-2012, 05:34:49
Hola ecfisa, ya estoy de nuevo por aca molestando de nuevo. Como puedes leer en el titulo del mensaje lo que necesito es saber que opción ha elegido un usuario para que a travez de eso pueda realizar otra acción. Espero poder explicarme con este ejemplo:
Si tengo dos dblookupcombo uno llamado 'Combo1' para almacenar nombres de Continentes y otro llamado 'combo2' para guardar los países; entonces si elijo por ejemplo continente americano en el combo1 el combo2 deberia mostrar México, Argentina, Chile, etc., pero si elijo África por lógica los países deben cambiar. Lo anterior lo lograba en los TCombobox identificando el 'itemindex' del combo y aplicaba 'Case' para los indices algo asi:

if (micombo.ItemIndex > -1) then
begin
indexcombo:=combomunicipios.ItemIndex;
case indexcombo of
0: combo2.Items.Add('México');
combo2.Items.Add('Argentina'); // suponiendo que el case 0 es América
1: combo2.Items.Add('Camerún'); // si el case 1 es África

Los componentes DBLookupComboBox no cuentan con la propiedad itemindex, por lo que he leído necesito tener varias tablas para enlazarlas a los DataSource y después al combo ¿verdad? se que puedo rellenarlos de forma manual, pero no se como hacerlo, ni tampoco como lograr que cambien para cada 'Case' entonces ¿como puedo lograr algo parecido a lo que hacia con los TComboBox?... agradeceré cualquier ayuda.

ecfisa
23-08-2012, 13:44:48
Hola wull.

Si no entiendo mál lo que buscas podrías manejar el filtrado desde la sentencia SQL, un ejemplo basado en la tabla country de dbdemos:

...
procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.Open;
ComboBox1.Clear;
ComboBox2.Clear;
while not Query1.Eof do
begin
ComboBox1.Items.Add(Query1.FieldByName('CONTINENT').AsString);
ComboBox2.Items.Add(Query1.FieldByName('NAME').AsString);
Query1.Next;
end;
end;

procedure TForm1.ComboBoxChange(Sender: TObject);
begin
with TComboBox(Sender) do
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM COUNTRY ');
if Name = 'ComboBox1' then
Query1.SQL.Add('WHERE CONTINENT = :PVALUE')
else
Query1.SQL.Add('WHERE NAME = :PVALUE');
Query1.ParamByName('PVALUE').AsString := Items[ItemIndex];
Query1.Open;
end;
end;

Asigna el método ComboBoxChange al evento OnChange de ambos TComboBox.

Saludos. :)

wull
04-09-2012, 21:53:18
Bien después de probar algunos de sus consejos y de leer mucho acerca del tema, pude dar con la solución. La verdad era bastante sencillo solo yo solo me complique la existencia. Al final use DBComboBox me resultaron bastante útiles para lograr lo que necesitaba, no sé porque no me di cuenta antes:D pero con esos controles si se pueden usar las propiedades ItemIndex e Item.Add que era lo que requería... muchas gracias a todos por tomarse la molestia de contestar y en especial a ecfisa por todas las atenciones brindadas.