Тестирование нескольких значений TComboBox одновременно - PullRequest
3 голосов
/ 27 марта 2011

Я новичок в Delphi, но, пожалуйста, помогите.

У меня есть 7 TComboBox на форме. Их значения присваиваются им с помощью SQL-запроса из той же таблицы, которая называется Numbers.

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 .... - это TComboBox.

Я пытаюсь заставить их проверить свои значения (все значения являются текстовыми), когда вы нажимаете на них. В частности, если вы выбираете cb1 = 1 из выпадающего списка, то если вы выбираете cb2 = 1 ... и т. Д., И вы назначаете тот же номер, он должен дать вам сообщение об ошибке

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

Какой метод вы бы порекомендовали мне использовать, я сражаюсь уже два дня.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 27 марта 2011

Создайте новую форму с семью полями со списком (с 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;
1 голос
/ 28 марта 2011

Проверка каждый раз, когда изменяется значение поля со списком, приводит к небольшому неудобству.Если вы хотите поменять местами значения двух полей со списком, вы должны сделать это окольным путем.

  • Установите для первого временное третье значение.
  • Установите для второго значениеисходное первое значение.
  • Установите для первого исходное второе значение.

Следующий код предоставляет средства для проверки всех комбинированных блоков в любой момент времени.Например, когда пользователь нажимает кнопку Ok.Конечно, вы все равно можете вызывать метод каждый раз, когда значение изменяется.

В коде также используется массив полей со списком, как в случае ответа Андреаса Рейбранда , поэтому я не буду повторять эту частькода.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...