【问题标题】:Trigger enable TButton with the pick of two (2) dates in TDateTimePickers在 DateTimePicker 中选择两 (2) 个日期触发启用按钮
【发布时间】:2020-05-18 13:40:17
【问题描述】:

我有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;

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

【问题讨论】:

    标签: delphi tdatetimepicker


    【解决方案1】:

    您的代码需要两个 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;
    

    【讨论】:

    • CurrentDate 有效!忘了看到 now() 包括时间。非常感谢!
    【解决方案2】:

    你可以简单地写:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2019-02-09
      相关资源
      最近更新 更多