我是Delphi的菜鸟,但请帮忙。

我在表单上有7个TComboBoxes。使用来自名为Numbers的同一表的SQL查询将它们的值分配给它们。

procedure TForm3.Button4Click(Sender: TObject);
begin

Q2.Close;
Q2.SQL.Clear;
Q2.SQL.Add ('Select num');
Q2.SQL.Add ('FROM numbers.dbf');
Q2.RequestLive := true;
Q2.Open;
cb1.Items.Add(q2.FieldByName('num').value);
cb1.Text:= '? ? ?';
cb2.Items.Add(q2.FieldByName('num').value);
cb2.Text:= '? ? ?';
...
...
...
end;


其中cb1,cb2 ....是TComboBoxes。

当您单击它们时,我试图让它们相互测试它们的值(所有值均为文本)。具体来说,如果您从下拉列表中选择cb1 = 1,那么如果您选择cb2 = 1 ... etc并分配了相同的数字,则应该给您一条错误消息

MessageDlg('Check Values: CB 1 and CB 2: Same Values Entered.',mtError, mbOKCancel, 0);


您会推荐我使用哪种方法,我已经战斗了两天。

提前致谢!

最佳答案

用七个组合框(带有Style := csDropDownList)创建一个新表单。然后,创建一个

var
  combos: array[1..7] of TComboBox;


并启动它:

procedure TForm1.FormCreate(Sender: TObject);
begin
  combos[1] := ComboBox1;
  combos[2] := ComboBox2;
  combos[3] := ComboBox3;
  combos[4] := ComboBox4;
  combos[5] := ComboBox5;
  combos[6] := ComboBox6;
  combos[7] := ComboBox7;
end;


那你就可以做

procedure TForm1.VerifyUniqueness(Sender: TObject);
begin
  if LongBool(TComboBox(Sender).Perform(CB_GETDROPPEDSTATE, 0, 0)) then
    Exit;
  for i := low(combos) to high(combos) do
    if (Sender <> combos[i]) and SameStr(TComboBox(Sender).Text, combos[i].Text) then
      raise Exception.CreateFmt('The fields %s and %s have the same value.', [TComboBox(Sender).Name, combos[i].Name]);
end;


并将VerifyUniqueness分配给每个组合框的OnChange事件。此外,您还需要

procedure TForm1.ComboBoxesKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then VerifyUniquness(Sender);
end;

10-08 10:57