在 DateTimePicker 中选择两 (2) 个日期触发启用按钮

Trigger enable TButton with the pick of two (2) dates in TDateTimePickers

我设置了 TButton "not enabled",当两个日期都被选中时,应该由两 (2) 个 TDateTimePickers 启用它。

我的 TDateTimePicker 日期默认为 now() 日期。因此,在 OnChange,我创建了以下代码,但我无法正确使用:

procedure TfrmPayroll.EnableButton; //my created procedure
begin
  if (dtpFrom.Date = Now()) and
     (dtpTo.Date = Now()) then
  begin
    btnOpen.Enabled := False;
  end
  else
  begin
    btnOpen.Enabled := True;
  end;

结果是启用了 TButton,即使我只选择了我设置的 2 个条件中的一个日期。

你可以简单地写:

procedure TfrmPayroll.EnableButton; //my created procedure
begin
  btnOpen.Enabled := (dtpFrom.Date <> Now()) and (dtpTo.Date <> Now());
end;

您的代码需要 both DTP 设置为 Now 才能禁用 Button,而不是 either DTP Now.

要修复现有代码,请使用 or 运算符而不是 and 运算符:

procedure TfrmPayroll.EnableButton;
begin
  if (dtpFrom.Date = Now()) or
     (dtpTo.Date = Now()) then
  begin
    btnOpen.Enabled := False;
  end else begin
    btnOpen.Enabled := True;
  end;
end;

如果您重写条件以使用 <> 运算符而不是 = 运算符,则可以简化:

procedure TfrmPayroll.EnableButton;
begin
  btnOpen.Enabled := (dtpFrom.Date <> Now()) and (dtpTo.Date <> Now());
end;

仅供参考,您应该使用 Date() 而不是 Now(),因为 TDateTimePicker.Date 属性 不应该包含时间,但 Now() 包含时间.如果本地时钟在两次 Date() 调用之间更改日期,您应该使用局部变量来避免竞争条件:

uses
 ..., DateUtils;

procedure TfrmPayroll.EnableButton;
var
  CurrentDate: TDate;
begin
  CurrentDate := Date();
  btnOpen.Enabled := (DateOf(dtpFrom.Date) <> CurrentDate) and (DateOf(dtpTo.Date) <> CurrentDate);
end;