1

我将 TButton 设置为“未启用”,当两个日期都被选中时,应该由两 (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 个条件中的一个日期。

4

2 回答 2

3

您的代码需要将两个DTP 都设置为Now以禁用按钮,而不是任何一个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;
于 2020-02-02T18:03:53.870 回答
2

你可以简单地写:

procedure TfrmPayroll.EnableButton; //my created procedure
begin
  btnOpen.Enabled := (dtpFrom.Date <> Now()) and (dtpTo.Date <> Now());
end;
于 2020-02-02T17:01:45.067 回答