Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Campo asociado a combobox (https://www.clubdelphi.com/foros/showthread.php?t=92561)

jafera 27-11-2017 18:06:22

Campo asociado a combobox
 
Buenas tardes.

Tengo un form con dos combobox que lleno con el proceso siguiente (el valor de los items es un campo numerico)
Código Delphi [-]
procedure TF_Sel_Epoca.FormCreate(Sender: TObject);
begin
        Selec.Close;
        Selec.Open;
        Selec.Last;
        Selec.First;
        While not Selec.Eof do
        begin
                Combobox1.Items.Add(IntToStr(SelecEPOCA_NUM.Value));
                Combobox2.Items.Add(IntToStr(SelecEPOCA_NUM.Value));
                Selec.Next;
        end;
end;

La consulta Selec tiene dos campos, Epoca_Num, que es el que cargo en el combobox y Epoca que es alfanumerico.
Hay algun método que me muestre al lado del combobox el valor del campo Epoca con el valor que le corresponde de la consulta cuando le de click en el combo box?

He hecho pruebas con un edit y siempre me muestra el ultimo valor, supongo que es porque el cursor se situa en el ultimo registro de la consulta al hacer el loop de carga.

Me guataria obtener algo como

ComboBox1 Edit
1 Valor numero 1

Si clico en el item dos, pues el edit que muestre valor numero 2

Gracias a todos por adelantado.

Saludos

duilioisola 27-11-2017 19:54:53

Yo tengo un procedimiento que me rellena los items de un ComboBox.
Items es una lista a la que puedes agregar un texto y un puntero mediante AddObject(Texto, Puntero);
El truco está en utilizar el valor del puntero y entenderlo como un entero en el que guardas valores numéricos (Normalmente le ID del elemento).
Código Delphi [-]
procedure TDMMain.RellenaEpoca(Lista: TStrings);
var
  Epoca : string;
  NroEpoca : integer;
begin
  // Primero limpio la lista de todos sus elementos
  Lista.Clear;

  // Obtengo los elementos de la base de datos
  Selec.Close;
  Selec.Open;
  Selec.Last;
  Selec.First;
  While not Selec.Eof do
  begin
     // El texto que va a mostrar el Combo
     Epoca := 'Epoca ' + IntToStr(SelecEPOCA_NUM.Value)

     // El id del dato (numero de epoca)
     NroEpoca := SelecEPOCA_NUM.Value;

     // Agrego estos datos a la lista
     Lista.AddObject(Epoca, Pointer(NroEpoca));

     Selec.Next;
  end;
end;

Luego lo utilizo así:
Código Delphi [-]
procedure TForm.FormCreate(Sender: TObject);
begin
  RellenaEpoca(ComboEpoca.Itmes);
  ComboEpoca.ItemIndex := 0;
end;

procedure TForm.ButtonClick(Sender: TObject);
var
  Epoca : string;
  NroEpoca : integer;
begin
  Epoca := ComboEpoca.Text;
  NroEpoca := integer(ComboEpoca.Items.Objects[ComboEpoca.ItemIndex]);

  Edit1.Text := 'Epoca seleccionada ' + IntToStr(Epoca);
  Edit2.Text := 'Nro de Epoca seleccionada ' + IntToStr(NroEpoca);
end;

ecfisa 27-11-2017 19:57:27

Hola.

En tu código estas cargando el mismo campo (SelecEPOCA_NUM) en el combo.

Te pongo un ejemplo que hace lo que entendí que deseabas hacer:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Selec.Open;
  while not Selec.Eof do
  begin
    ComboBox1.AddItem(SelecEPOCA.AsString, TObject(SelecEPOCA_NUM.AsInteger));
    Selec.Next;
  end;
  Selec.Close;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
var
  cb: TComboBox;
  num: Integer;
  epo: string;
begin
  cb  := TComboBox(Sender);      // SelecEPOCA
  epo := cb.Items[cb.ItemIndex]; // SelecEPOCA_NUM
  num := Integer(cb.Items.Objects[cb.ItemIndex]);
  ShowMessageFmt('EPOCA         : %s%sEPOCA_NUM: %d',[epo, #10,num]);
end;

Saludos :)

jafera 28-11-2017 09:44:44

Buenos dias.

Posiblemente no expliqué bien todo el proceso.
El hecho de llenar dos combobox iguales, es para hacer un listado limitado por valores y el campo que mando al filtro del informe es Epoca_Num ya que Epoca me daba errores de mezcla al ordenar por alfanumérico.
O sea que el campo que debo tener accesible para enviar al informe y que me haga el filtro es Epoca_Num.

Os explico un poco la base del "tema", se trata de una base de datos de mi colección de trenes en miniatura, los trenes en la vida real a escala 1, se dividen en épocas acotadas por años.
Las épocas se representan en múmeros romanos, actualmente estamos en la época "VI".
Lo que ocurre es que a veces tengo material el cual no tiene la época asignada por algún motivo, falta de datos por ejemplo y yo le dejo una época comodín que es "S/D" lo que significa sin determinar.
Si hago la selección por épocas entre la "III" y la "V", pues que pasa, que en medio se cuelan los de la época "S/D" y esto es lo que quiero evitar con el campo numérico Epoca_Num.
A "S/D" le he dado el valor 999 para que sea siempre el último.
Cuando cargo Epoca_Num en el ComboBox1 y en el ComboBox2, todo funciona bien, y envio al filtro de la consulta el valor de ComboBoxX.Text sin problema, por esto necesito el campo Epoca_Num.

Tambien he pensado que igual deberia usar dos consultas separadas, una por combo.

Gracias por leerme e instruirme.

Saludos

Josep

jafera 28-11-2017 16:22:46

Hola de neuvo.

Siguiendo el consejo de ecfisa y variando un poco la salida de datos, he conseguido que en el combobox pueda seleccionar el campo Epoca (texto) y ver en un edit el campo Epoca_Num (numero).

Código Delphi [-]
procedure TF_Sel_Epoca.FormCreate(Sender: TObject);
begin
        Selec1.Open;
        while not Selec1.Eof do
        begin
                ComboBox1.AddItem(Selec1EPOCA.AsString, TObject(Selec1EPOCA_NUM.AsInteger));
                Selec1.Next;
        end;
        Selec1.Close;

        Selec2.Open;
        while not Selec2.Eof do
        begin
                ComboBox2.AddItem(Selec2EPOCA.AsString, TObject(Selec2EPOCA_NUM.AsInteger));
                Selec2.Next;
        end;
        Selec2.Close;
end;

Código Delphi [-]
procedure TF_Sel_Epoca.ComboBox1Click(Sender: TObject);
var
        cb: TComboBox;
        num: Integer;
        epo: string;
begin
        cb  := TComboBox(Sender);      // SelecEPOCA
        epo := cb.Items[cb.ItemIndex]; // SelecEPOCA_NUM
        num := Integer(cb.Items.Objects[cb.ItemIndex]);
        Edit1.Text:=IntToStr(num);
end;

He probado a variar los parametros para que el combobox mostrara el campo Epoca_num y el edit el campo Epoca sin resultado satisfactorio.

Es posible hacerlo?

Gracias

La opcion de duilioisola no he podido probarla ya que no consigo declarar el procedure o lo declaro mal o en sitio erroneo.

Josep

ecfisa 28-11-2017 18:09:55

Hola Josep.

No alcanzo a interpretar la situación, ¿ Los datasets Selec1 y Selec2 hacen referencia a la misma tabla ?

Por que si lo que necesitas es lo que indicabas en tu primer mensaje:
Cita:

Empezado por jafera (Mensaje 522926)
Hay algun método que me muestre al lado del combobox el valor del campo Epoca con el valor que le corresponde de la consulta cuando le de click en el combo box?

basta con que, por ejemplo, situes un Label al lado del ComboBox y el siguiente código:
Código Delphi [-]
procedure TF_Sel_Epoca.FormCreate(Sender: TObject);
begin
  Selec.Open;
  while not Selec.Eof do
  begin
    ComboBox1.AddItem(SelecEPOCA.AsString, TObject(SelecEPOCA_NUM.AsInteger));
    Selec.Next;
  end;
  Selec.Close;
end;

procedure TF_Sel_Epoca.ComboBox1Click(Sender: TObject);
var
  cb: TComboBox;
begin
  cb := TComboBox(Sender);
  Label1.Caption := IntToStr( Integer(cb.Items.Objects[cb.ItemIndex]) );
end;
Así el valor EPOCA se muestra al lado del ComboBox (en el Label)

Saludos :)

jafera 28-11-2017 19:08:30

Gracias Ecfisa

Igual no me acabo de explicar yo correctamente.
Lo que me gustaria es que en el Combo se cargara el campo numerico Epoca_Num (Int) y en un edit o label se mostrara el valor de Epoca (Text).
Actualmente la carga es al revés en el combo va Epoca (text) y en el edit Epoca_Num (Int)

Saludos

Josep

ecfisa 28-11-2017 19:57:25

Hola.

Ahora si entendí, un modo de hacerlo puede ser este:

Código Delphi [-]
...
implementation

var
  TS: TStringList;

procedure TF_Sel_Epoca.FormCreate(Sender: TObject);
begin
  TS := TStringList.Create;
  Selec.Open;
  while not Selec.Eof do
  begin
    TS.Add(SelecEPOCA.AsString);
    ComboBox1.Items.Add(SelecEPOCA_NUM.AsString);
    Selec.Next;
  end;
  Selec.Close;
  ComboBox1.ItemIndex := -1;
end;

procedure TF_Sel_Epoca.ComboBox1Click(Sender: TObject);
var
  cb: TComboBox;
begin
  cb := TComboBox(Sender);
  Label1.Caption := TS[cb.ItemIndex]
end;

...

procedure TF_Sel_Epoca.FormDestroy(Sender: TObject);
begin
  TS.Free;
end;

end.

Saludos :)

jafera 29-11-2017 13:08:57

Gracias por la respuesta Daniel.

Ha funcionado perfecto, es exactamente lo que queria conseguir.
En vez de pasar el valor a la label lo paso al edit y queda mas estetico.....

Saludo y repito, gracias.

Josep


La franja horaria es GMT +2. Ahora son las 17:26:03.

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