簡體   English   中英

一次測試多個TComboBox值

[英]Testing multiple TComboBox values at once

我是德爾福的菜鳥,但請幫忙。

我在表單上有7個TComboBox。 使用名為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 ...等並且您指定了相同的數字,它應該會給您一個錯誤消息

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;

每次組合框的值更改時進行驗證確實會導致一些小的不便。 如果要交換兩個組合框的值,則必須以環形方式進行。

  • 將第一個值設置為臨時第三個值。
  • 將第二個值設置為原始第一個值。
  • 將第一個值設置為原始第二個值。

以下代碼提供了在任何時間點驗證所有組合框的方法。 例如,當用戶單擊“確定”按鈕時。 當然,每次值更改時,您仍然可以調用該方法。

代碼也使用了一組組合框,就像Andreas Rejbrand的答案一樣 ,所以我不會重復代碼的那一部分。

procedure ValidateComboBoxes;
var
  LCombValues: TStrings;
  I: Integer;
  LDuplicateIndex: Integer;
begin
  LComboValues := TStringList.Create;
  try
    for I := Low(FCombos) to High(FCombos) do
    begin
      LDuplicateIndex := LComboValues.IndexOf(FCombos[I].Text);
      if (LDuplicateIndex >= 0) then
      begin
        raise Exception.Create('The value: ['+FCombos[I].Text+
          '] has been duplicated in the following Combo Boxes: ['+FCombos[I].Name+
          '] and ['+TComboBox(LComboValues.Objects[LDuplicateIndex]).Name+']');
      end;
      LComboValues.AddObject(FCombos[I].Text, FCombos[I]);
    end;
  finally
    LComboValues.Destroy;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM