[英]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.