Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Dos comboBox combinados (https://www.clubdelphi.com/foros/showthread.php?t=89805)

ciudad54 10-02-2016 06:16:21

Dos comboBox combinados
 
Hola,

La situacion es la siguiente:
No se como tener dos combobox combinados para que al seleccionar un dato en el primero, solo me aparezcan los correspondientes en el segundo. Ejemplo

Combobox1 - Items:
1
2
3

al seleccionar el valor 1, en el combobox2 debe solamente aparecer :
1.1
1.2
1.3

Esto quiero hacerlo con una base de datos de médicos y especialidades, donde selecciono la especialidad y solo me aparecen los médicos de esa especialidad.

Gracias, espero puedan entender la idea.

AgustinOrtu 10-02-2016 07:27:27

Busca informacion sobre maestro-detalle

Podes usar controles data-aware (los que empiezan con TDB...) o bien usar los "comunes" e implementar todo

ecfisa 10-02-2016 07:32:23

Hola ciudad54.

Usando dos TComboBox podrías hacer:
Código Delphi [-]
// ComboBox1 = especialidad | ComboBox2 = medico

procedure TForm1.FormCreate(Sender: TObject);
begin
  qyEspec.Close;
  qyEspec.SQL.Text := 'SELECT ID, ESPEC FROM ESPECIALIDAD';
  qyEspec.Open;
  while not qyEspec.Eof do
  begin
    ComboBox1.AddItem(qyEspec.FieldByName('ESPEC').AsString,
      TObject(qyEspec.FieldByName('ID').AsInteger));
    qyEspec.Next;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  cb: TComboBox;
begin
  cb := TComboBox(Sender);
  if cb.ItemIndex <> -1 then
  begin
    qyMedic.Close;
    qyMedic.SQL.Text := 'SELECT NOMBRE FROM MEDICO WHERE ESPEC_ID = :ID';
    qyMedic.ParamByName('ID').AsInteger := Integer(cb.Items.Objects[cb.ItemIndex]);
    qyMedic.Open;
    ComboBox2.Clear;
    while not qyMedic.Eof do
    begin
      ComboBox2.Items.Add(qyMedic.FieldByName('NOMBRE').AsString);
      qyMedic.Next;
    end;
  end;
end;

Pero resulta mucho mas simple usar dos TDBLoocupComboBox:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  qyEspec.Close;
  qyEspec.SQL.Text := 'SELECT ID, ESPEC FROM ESPECIALIDAD';
  qyEspec.Open;

  qyMedic.DataSource := dsEspec;   // TDataSource asociado al dataset especialidad

  DBLookupComboBox1.KeyField   := 'ID';
  DBLookupComboBox1.ListField  := 'ESPEC';
  DBLookupComboBox1.ListSource := dsEspec;

  DBLookupComboBox2.KeyField   := 'ID';
  DBLookupComboBox2.ListField  := 'NOMBRE';
  DBLookupComboBox2.ListSource := dsMedic;  // TDataSource asociado al dataset medico
end;

procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
  qyMedic.Close;
  qyMedic.SQL.Text := 'SELECT ID, NOMBRE FROM MEDICO WHERE ESPEC_ID = :ID';
  qyMedic.Open;
end;

Saludos :)

ciudad54 15-02-2016 14:15:20

Excelente, me funciono perfecto!
Mil gracias!


La franja horaria es GMT +2. Ahora son las 06:26:15.

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