PDA

Ver la Versión Completa : Recorrer tabla y asignar Items a comboBox


DANIEL1818
24-06-2015, 18:33:35
Hola foro, espero que anden bien!

Esta vez lo que necesito es recorrer una tabla de productos y asignar cada nombre de producto a un comboBox. Lo que hice fue hacer:

procedure TForm5VerOfertas.FormActivate(Sender: TObject);
var
miNombre: string;
begin


miNombre:= Form1.Label7.Caption;
DM.Subastas.Open;
DM.Subastas.Prior;
while not DM.Subastas.eof do begin
if(DM.Subastas.FieldByName('nombre_usuario').AsString = miNombre) and (DM.Subastas.FieldByName('fecha_fin').AsDateTime < Date) then
ComboElegirSubasta.Items.Add(DM.Subastas.FieldByName('titulo').AsString);
DM.Subastas.Next;
end;

end;

--EL PROBLEMA:

Esto me lo agrega en el comboBox uno abajo del otro, pero el problema es que NO me lo agrega de la forma: en el itemIndex 0 esta el producto 1, en el itemIndex 1 esta el producto 2 y asi.. Lo que hace esto es agregarme en el itemIndex 0 todos los nombres de los productos juntos, OSEA en el itemIndex 0 = producto1producto2 , lo mismo para los demas itemIndex ( ya que lo probe con un edit al lado para ver que era lo que me devolvia ).

ENTONCES : como hago para recorrer la tabla y asignar al itemIndex 0 el producto 1, en el itemIndex 1 el producto 2, y asi sucesivamente??porque no le doy pie con bola.

LES AGRADEZCO MUCHISIMO SUS AYUDAS!!

ecfisa
24-06-2015, 19:00:24
Hola Daniel.

La forma genérica de cargar un ComboBox es,

ComboBox1.Clear;
with tuDataSet do
begin
Open;
while not Eof do
begin
if ( una_condición ) then // Opcional
ComboBox1.Items.Add(FieldByName('TU_CAMPO').AsString);
Next;
end;
end;

pero, ¿ Que componente es Subastas ?

No te pregunto el nombre que le diste a la tabla en la bd ni el gestor de bd, me refiero a el nombre de la clase del componente Subastas.

Saludos :)

DANIEL1818
24-06-2015, 19:08:22
Antes que nada muchas gracias por tu respuesta,esa componente es un ADOTable que le di el nombre de "subastas" y que se encuentra en mi modulo de datos, espero que me hayas entendido! Ojala me puedas dar una ayuda!

Casimiro Notevi
24-06-2015, 19:40:45
Ojala me puedas dar una ayuda! ¿Qué más ayuda quiéres, DANIEL1818? si te ha puesto el código, solamente tienes que sustituir "tuDataset" por el nombre del tuyo (dm.subasta)

ecfisa
24-06-2015, 20:12:56
¿Qué más ayuda quiéres, DANIEL1818? si te ha puesto el código, solamente tienes que sustituir "tuDataset" por el nombre del tuyo (dm.subasta) Ciertamente... :D

Daniel, mi pregunta sobre el componente apuntaba a que resulta mas simple de ver (y seguramente mas eficiente) filtrar los resultados antes de cargar el combo, para tu caso:

...
with DM.Subastas do
begin
Close;
Open;
// Filtrar
Filtered := False;
Filter := Format('NOMBRE_USUARIO = %s AND FECHA_FIN < %s', [MiNombre, DateToStr(Date)]);
Filtered := True;

// Copiar resultado al combo
DisableControls;
try
while not Eof do
begin
ComboBox1.Items.Add(FieldByName('TITULO').AsString);
Next;
end;
finally
EnableControls;
Filtered := False; // Quitar el filtro
end;
end;
ComboBox1.ItemIndex := 0;
end;


Saludos :)

DANIEL1818
24-06-2015, 22:10:15
A ver si me explico mejor, con el código que hice yo y el que me pasaste me lo agrega mal, es decir, si mi tabla tiene dos productos, mesa y silla, recorro la tabla y con el código que me pasaste y el que había hecho antes yo me pasa lo siguiente: cuando le pido que me imprima a través de un Edit lo que tiene el comboBox en la posición cero, lo imprime de esta forma: mesasilla. Esto tambien me pasa cuando le pido que me imprima lo que tiene el comboBox en la posición 1, me explico? Ese es el problema que no puedo resolver, por eso pedí si me podían dar una ayuda. Disculpen si moleste!

ecfisa
24-06-2015, 22:37:33
Hola Daniel.

Realmente no sé por que te sucede lo que te sucede. El resultado que mencionas es totalmente incongruente con el comportamiento del método Add de TStrings (método que usas para agregar los datos al combo).
Y tampoco encuentro otro modo de explicarte como cargar un TComboBox si no es de los modos que publiqué anteriormente...

Lo único que se me ocurre es demostrarte con un ejemplo real lo que te menciono. Para lo cuál te adjunto un demo con tabla incluida para que puedas evaluar el comportamiento y cotejarlo con tu código.

Por motivos de comodidad te envío un ejemplo con BDE (que viene con Delphi). La única diferencia es que usa un TTable en lugar de un TADOTable pero funcionalmente es lo mismo.

Crea una carpeta y descomprime allí el archivo.

Saludos :)

DANIEL1818
25-06-2015, 00:02:10
Hola Daniel.

Realmente no sé por que te sucede lo que te sucede. El resultado que mencionas es totalmente incongruente con el comportamiento del método Add de TStrings (método que usas para agregar los datos al combo).
Y tampoco encuentro otro modo de explicarte como cargar un TComboBox si no es de los modos que publiqué anteriormente...

Lo único que se me ocurre es demostrarte con un ejemplo real lo que te menciono. Para lo cuál te adjunto un demo con tabla incluida para que puedas evaluar el comportamiento y cotejarlo con tu código.

Por motivos de comodidad te envío un ejemplo con BDE (que viene con Delphi). La única diferencia es que usa un TTable en lugar de un TADOTable pero funcionalmente es lo mismo.

Crea una carpeta y descomprime allí el archivo.

Saludos :)




Gracias por tu respuesta. Ya lo hice y me sigue pasando lo mismo, incluso tambien probe con un TListBox y me pasa exactamente lo mismo, en el EDIT de prueba me sigue apareciendo "mesasilla" cuando me deberia aparecer un solo producto. Lo que yo tengo que hacer es seleccionar un item del comboBox y luego apreto un boton (TButton), y recien ahi le paso el parametro a la consulta (ADOquery), pero por esto que me pasa no puedo realizar dicho filtrado :/ , ni siquiera cuando el comboBox tiene dentro UN SOLO item, la consulta que hago (desde delphi 2010) es esta:

procedure TForm5VerOfertas.Button2Click(Sender: TObject);
var
productoElegido: string;
begin
productoElegido:= ComboElegirProducto.Items.Text;

DM.QueryVerOfertasHaciaMi.Close;
DM.QueryVerOfertasHaciaMi.Parameters.ParamByName('miProducto').Value:=productoElegido;
DM.QueryVerOfertasHaciaMi.Open;

end;


Esta bien pasado el parámetro? ACLARACIÓN: si "productoElegido" lo asocio a un EDIT y le escribo el nombre del producto (para pasarle el parametro a la contulta) por el que quiero que me filtre anda correctamente, ahora con esta solución asociado al ComboElegirProducto (TComboBox) deja de funcionar.

Nuevamente gracias por sus respuestas y disculpen las molestias!

ecfisa
25-06-2015, 00:28:31
Hola Daniel.
...Ya lo hice y me sigue pasando lo mismo,
¿ Estas diciendo que el programa que adjunté concatena columnas de los campos en cada item del combo ?



...incluso tambien probe con un TListBox y me pasa exactamente lo mismo, en el EDIT de prueba me sigue apareciendo "mesasilla"
Por favor, agregá un TButton (Button1 o como se llame) y este código en el evento OnClick del mismo,

procedure TForm5VerOfertas.Button1Click(Sender: TObject);
begin
if not DM.Subastas.Active then
DM.Subastas.Open;
ShowMessage(DM.Subastas.FieldByName('titulo').AsString);
end;

y por favor comentanos textualmente que cadena muestra el cuadro de diálogo.


...Esta bien pasado el parámetro?
Si el parámetro fué bién definido en el código SQL y la columna miProducto es de tipo TStringField o alguno de sus descendientes, la asignación es correcta.

Saludos :)

DANIEL1818
25-06-2015, 18:56:36
Si pongo ese codigo el mensaje que me aparece es : Bicicleta.

Con respecto al programita que me pasaste le agregue un edit y un TButton y al onClick del Tbutton le puse el siguiente codigo:

Edit1.Text:=ComboBox1.Items.text; //le pido el item ue esta seleccionado en ese momento

y el resultado en el edit es:

ArgentinaBrazilColombiaMexicoUnited States of America

(sale concatenado)

AHORA si copio lo del edit (el resultado que les acabo de mostrar) y los pego en un documento de texto, se pega de la siguiente forma:

Argentina
Brazil
Colombia
Mexico
United States of America

pd : sigo sin poder solucionar el problema de seleccionar un item del combo y pasarselo como paramero al ADOquery por el problema que te acabo de comentar

nlsgarcia
25-06-2015, 19:51:16
DANIEL1818,


...sigo sin poder solucionar el problema de seleccionar un item del combo...

:rolleyes:

Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
for i := 1 to 5 do
ComboBox1.Items.Add('Data-' + IntToStr(i));
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
Edit1.Text := ComboBox1.Items.Strings[ComboBox1.ItemIndex];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text := ComboBox1.Items.Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text := ComboBox1.Items.Text;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ComboBox1.Text := EmptyStr;
Edit1.Text := EmptyStr;
Edit2.Text := EmptyStr;
Memo1.Text := EmptyStr;
end;

end.

El código anterior en Delphi 7 sobre Windows 7 Professional x32, Ejemplifica el uso de la propiedad TComboBox.Items de tipo TStrings, como se muestra en la siguiente imagen:

http://i.imgur.com/l08WpcY.gif

Revisa esta información relacionada a la propiedad TComboBox.Items (TStrings) :

1- TStringList (http://www.delphibasics.co.uk/RTL.asp?Name=TStringList)

2- El objeto StringList (I) (http://delphiallimite.blogspot.com/2007/08/el-objeto-stringlist-i.html)

3- El objeto StringList (II) (http://delphiallimite.blogspot.com/2007/08/el-objeto-stringlist-ii.html)

4- El objeto StringList (y III) (http://delphiallimite.blogspot.com/2007/08/el-objeto-stringlist-y-iii.html)

Espero sea útil :)

Nelson.

ecfisa
25-06-2015, 19:53:27
Hola Daniel.
Si pongo ese codigo el mensaje que me aparece es : Bicicleta.

Con respecto al programita que me pasaste le agregue un edit y un TButton y al onClick del Tbutton le puse el siguiente codigo:

Edit1.Text:=ComboBox1.Items.text; //le pido el item ue esta seleccionado en ese momento

y el resultado en el edit es:

ArgentinaBrazilColombiaMexicoUnited States of America
...
¡ Con razón, ahora si me lo explico ! :)

La propiedad TComboBox.Items.Text no contiene el item seleccionado en ese momento sino el grupo de cadenas delimitadas por CR y LF y que conforman el conjunto de items del combo.

Has confundido la propiedad TComboBox.Text que el combo hereda de la clase TControl y que contiene el texto asociado al control, con la propiedad TComboBox.Items.Text que pertenece la clase TStrings.

Para obtener el item actualmente seleccionado podes hacer:

Edit1.Text := ComboBox1.Text;


o de otro modo, mediante la propiedad ItemIndex:

Edit1.Text := ComboBox1.Items[ComboBox1.ItemIndex];


Pero de ninguna manera:
Edit1.Text := ComboBox1.Items.Text;

Saludos :)

DANIEL1818
26-06-2015, 03:25:23
Muchisimas gracias a todos!! ya pude solucionar el problema!! al combo le pedia comboBox.items.text y en realidad era ComboBox.text

Nuevamente muchas gracias por la buena onda, y por todas las soluciones e info que me pasaron!