Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asignar valor ComboBox a una variable (https://www.clubdelphi.com/foros/showthread.php?t=15109)

gluglu 11-10-2004 13:07:49

Asignar valor ComboBox a una variable
 
Por qué?
Código Delphi [-]
procedure TMasterObject.ComboBox1Exit(Sender: TObject);
var
   cVal : Integer;
begin
  cVal := ComboBox1.ItemIndex;
  Case ComboBox1.ItemIndex of
    0:
      begin .....
Con el Debug veo que el valor de ComboBox1.ItemIndex es = 0,1,2,3 pero al asignar ese valor a la variable cVal, cVal siempre es 0.

Por qué?

marcoszorrilla 11-10-2004 16:20:42

Código Delphi [-]
procedure TMasterObject.ComboBox1Exit(Sender: TObject);
var
   cVal : Text;
begin
  cVal := ComboBox1.Text;

Un Saludo.

marcoszorrilla 11-10-2004 16:29:30

Acabo de releer tu pregunta y no veo muy claro lo que quieres, te añado este otro código para ver si van por ahí los tiros:

Código Delphi [-]
 procedure TForm1.ComboBox1Change(Sender: TObject);
 begin
 ShowMessage(Combobox1.Items[ComboBox1.ItemIndex]);
 end;
Un Saludo.

__hector 11-10-2004 16:32:37

itemIndex devuelve el indice del valor seleccionado en el combobox, el cual es unico en cada corrida de una funcion (no puede ser dos y tres al mismo tiempo). Eso indica que siempre que corres ese procedure, esta seleccionado el primer item del combo. No?

gluglu 11-10-2004 18:17:21

Gracias Amigos,

Es mucho más simple que todo eso. Lo que quiero es asignar el índice del 'elemento seleccionado', es decir, el ItemIndex, a una variable para después volver a utilizar ese valor.

ComboBox1 tiene los siguientes Strings : 'Diario', 'Horas', 'Minutos' e 'Intervalos'. En una base de datos se va a guardar el valor 0, 1, 2 o 3, según el elemento seleccionado.

Lo que me pasa en concreto, curiosamente es lo siguiente :

Que tengo otro procedimiento asociado al DataSource
Código Delphi [-]
procedure TMasterObject.DataSource1DataChange(Sender: TObject;
  Field: TField);
begin
    ComboBox2.ItemIndex := IBQuery1DIVISIONTYPE.Value;
  Case IBQuery1DIVISIONTYPE.Value of
    0: begin
      DBEdit1.Visible := False;
      Label5.Visible  := False;
      Label4.Enabled  := False;
    end;
    1..3: begin
      DBEdit1.Visible := True;
      Label5.Visible  := True;
      Label4.Enabled  := True;
      Case IBQuery1DIVISIONTYPE.Value of
        1: Label5.Caption := 'Horas';
        2: Label5.Caption := 'Minutos';
        3: Label5.Caption := 'Intervalos';
      end;
    end;
  end;
end;

Precisamente esto lo hago para que según el valor de la base de datos en el campo DIVISIONTYPE (0,1,2 o 3) me muestre correctamente el 'String' asociado a cada valor en el ComboBox2. Hasta aquí correcto.

Pero ahora resulta que cuando selecciono un elemento del ComboBox2 y quiero asignarle el valor 0, 1, 2 o 3 según el String seleccionado mediante:
Código Delphi [-]
procedure TMasterObject.ComboBox2Exit(Sender: TObject);
begin
  Case ComboBox2.ItemIndex of
    0: begin
      DBEdit1.Visible := False;
      Label5.Visible  := False;
      Label4.Enabled  := False;
      IBQuery1.Edit;
      IBQuery1INTERVAL.Value := 0;
    end;
    1..3: begin
      DBEdit1.Visible := True;
      Label5.Visible  := True;
      Label4.Enabled  := True;
      Case ComboBox2.ItemIndex of
        1: Label5.Caption  := 'Horas';
        2: Label5.Caption  := 'Minutos';
        3: Label5.Caption  := 'Intervalos';
      end;
      IBQuery1.Edit;
    end;
  end;
  IBQuery1DIVISIONTYPE.Value := ComboBox2.ItemIndex;
  IBQuery1.Post;
end;
precisamente entonces no puedo asignar al campo DIVISIONTYPE el valor seleecionado, ya que como tengo que poner en modo edit el Query1, con IBQuery1.Edit, este a su vez me llama al método anterior del DataSource1DataChange y fastidiosamente me vuelve a resetear el valor que había inicialmente en el campo DIVISIONTYPE de la base de datos, con lo que nunca me lo cambia según estos métodos.

Lo que debería querer hacer es:
Código Delphi [-]
procedure TMasterObject.ComboBox2Exit(Sender: TObject);
var
  cVal : Integer;
begin
  cVal := ComboBox2.ItemIndex;
  Case cVal of
    0: begin
      DBEdit1.Visible := False;
      Label5.Visible  := False;
      Label4.Enabled  := False;
      IBQuery1.Edit;
      IBQuery1INTERVAL.Value := 0;
    end;
    1..3: begin
      DBEdit1.Visible := True;
      Label5.Visible  := True;
      Label4.Enabled  := True;
      Case cVal of
        1: Label5.Caption  := 'Horas';
        2: Label5.Caption  := 'Minutos';
        3: Label5.Caption  := 'Intervalos';
      end;
      IBQuery1.Edit;
    end;
  end;
  IBQuery1DIVISIONTYPE.Value := cVal;
  IBQuery1.Post;
end;

De ahí precisamente mi pregunta inicial. Quiero asignar a cVal el índice seleccionado en el ComboBox2 para despues poder hacer IBQuery1.Edit y darle el valor correcto a DIVISIONTYPE.

Lo muy raro, (por lo menos para mí, y ya sé que la solución será muy simple...) es que mirando con el Debug, cuando ejecuto
Código Delphi [-]
cVal := ComboBox2.ItemIndex
independientemente del elemento seleccionado del ComboBox2, cVal siempre es 0!! Y de nuevo mi pregunta, por qué?

Muchas gracias una vez más.

basti 11-10-2004 18:40:21

Para evitar el problema que comentas, podrías deshabilitar el evento onDataChange, cuando cambias el comboBox.

Código Delphi [-]
procedure TMasterObject.ComboBox2Exit(Sender: TObject);
begin
  DataSource.onDataChange := nil;
  IBQuery1.Edit;
  IBQuery1DIVISIONTYPE.Value := ComboBox2.ItemIndex;
  IBQuery1.Post;
  DataSource.onDataChange := DataSource1DataChange;
end;

un saludo

gluglu 11-10-2004 18:54:44

Muchas gracias, así funciona.

No obstante, me queda la duda de porqué cVal no adopta el valor correspondiente. Entiendo que es porque la variable cVal apunta a la posición de la memoria donde se almacena el valor de ComboBox2.ItemIndex.

Por eso mi pregunta de como podría almacenar el valor correspondiente de la selección en esa variable? Pregunto, debería declararla como cVal : const;?


La franja horaria es GMT +2. Ahora son las 07:11:43.

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