Ошибка при ЗАЯВЛЕНИИ с несколькими условиями И - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть эти элементы управления TDateTimePicker, TComboBox, Tedit и TButton.TButton отключен по умолчанию.Чего я хотел бы добиться, так это включить TButton, когда все остальные элементы управления заполнены или не заполнены нулями.

С помощью следующих кодов все 3 элемента управления, начиная с TDateTimePicker, при заполнении У меня нет проблем, это работаеткак и ожидалось.

Ошибка возникает, когда я заполняю TComboxBox, а затем TEdit, он включает TButton, даже если TDateTimePicker еще не заполнен.Или наоборот, я буду заполнять TEdit, а затем TComboBox, он включает TButton.

Из кодов, приведенных ниже, я ожидаю, что TButton не включится, пока не будут заполнены все 3 элемента управления.

IПытался выяснить (весь день), как эта ошибка произошла.

Я буду признателен всем, кто поможет мне разобраться в этом.

procedure TfrmHolidays.EnableSaveButton;
begin
if (edtHolidayName.Text <> NullAsStringValue) and (cmbHolidayType.ItemIndex <> -1)and (dtpHolidayDate.Date <> 0) then
  begin
    btnHolidaySave.Enabled := True;
  end
  else
  begin
    btnHolidaySave.Enabled := False;
  end;
end;

procedure TfrmHolidays.dtpHolidayDateChange(Sender: TObject);
begin
  EnableSaveButton;
end;

procedure TfrmHolidays.cmbHolidayTypeChange(Sender: TObject);
begin
  EnableSaveButton;
end;

procedure TfrmHolidays.edtHolidayNameChange(Sender: TObject);
begin
  EnableSaveButton; // triggers enable btnHolidaySave button
end;

Кстати, у меня естьбольше кода, связанного с тем, чтобы сделать TDateTimePicker пустым, и я предположил, что с этим проблем нет.Я также попытался вложить в If Statement каждое условие, и я все еще получаю ошибку.Кроме того, я проверял каждое условие за раз, и оно отлично работает.

Обновления: вот как я инициализировал dtpHolidayDate.Date:

procedure TfrmHolidays.FormCreate(Sender: TObject);
begin
  DateTime_SetFormat(dtpHolidayDate.Handle, ' ');
  FDTMDateEmpty := True;
end;

procedure TfrmHolidays.dtpHolidayDateCloseUp(Sender: TObject);
begin
  DateTime_SetFormat(dtpHolidayDate.Handle, PChar('MMM dd yyyy (ddd)'));
end;

procedure TfrmHolidays.dtpHolidayDateChange(Sender: TObject);
begin
  FDTMDateEmpty := False;
  EnableSaveButton; // same and updated procedure above
end;

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Хотя это и не показано в вопросе, я могу предположить, что вы инициализируете дату с помощью

dtpHolidayDate.Date := 0;

После этого проверка даты по 0 не будет (скорее всего), потому что часть времени все еще содержит времячто элемент управления создан.

Вы можете инициализировать с помощью

dtpHolidayDate.DateTime := 0;

, затем вы можете проверить дату, как вы делаете.

В качестве альтернативы вы можете использовать SameDate, чтобы сделатьсравнение.

uses
  dateutils;


if (edtHolidayName.Text <> NullAsStringValue) and (cmbHolidayType.ItemIndex <> -1)
    and (not SameDate(dtpHolidayDate.Date, 0)) then
0 голосов
/ 19 сентября 2019

Как указано в комментариях выше, у вас нет инициализированного значения для TDateTimePicker.

То, что вы хотите, это установить по умолчанию разумную дату, а не установить в 0 - это невообще полезно для пользователей.

Я бы ввел логический флаг, который вы устанавливаете самостоятельно после установки TDateTimePicker.

Вы можете установить этот флаг в обработчике событий OnChange.

Так что-то вроде:


interface

protected
  blMyDTFlag: Boolean;
...

implementation
  function TfrmHolidays.dtpHolidayDateChange(Sender: TObject);
  begin
    Self.blMyDTFlag:=True;
  end

procedure TfrmHolidays.EnableSaveButton;
begin
if (edtHolidayName.Text <> '') and
   (cmbHolidayType.ItemIndex <> -1) and
   (Self.dtMyDTFlag) then
    btnHolidaySave.Enabled := True
  else
    btnHolidaySave.Enabled := False;
end;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...