Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer tabla y asignar Items a comboBox (https://www.clubdelphi.com/foros/showthread.php?t=88564)

DANIEL1818 24-06-2015 18:33:35

Recorrer tabla y asignar Items a comboBox
 
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:

Código Delphi [-]
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,
Código Delphi [-]
  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

Cita:

Empezado por DANIEL1818 (Mensaje 493633)
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

Cita:

Empezado por Casimiro Notevi (Mensaje 493635)
¿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:
Código Delphi [-]
...
  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

1 Archivos Adjunto(s)
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

Cita:

Empezado por ecfisa (Mensaje 493640)
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:

Código Delphi [-]
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.
Cita:

Empezado por DANIEL1818 (Mensaje 493642)
...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 ?



Cita:

Empezado por DANIEL1818 (Mensaje 493642)
...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,
Código Delphi [-]
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.


Cita:

Empezado por DANIEL1818 (Mensaje 493642)
...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:

Código Delphi [-]
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,

Cita:

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

:rolleyes:

Revisa este código:
Código Delphi [-]
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:



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

Nelson.

ecfisa 25-06-2015 19:53:27

Hola Daniel.
Cita:

Empezado por DANIEL1818 (Mensaje 493675)
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:

Código Delphi [-]
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:
Código Delphi [-]
   Edit1.Text := ComboBox1.Text;

o de otro modo, mediante la propiedad ItemIndex:
Código Delphi [-]
   Edit1.Text := ComboBox1.Items[ComboBox1.ItemIndex];

Pero de ninguna manera:
Código Delphi [-]
 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!


La franja horaria es GMT +2. Ahora son las 16:39:38.

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