TDateTimePicker MaxDate - 不允许将控件设置为当前日期

TDateTimePicker MaxDate - does not allow setting control to current date

我已将标准 VCL TDateTimePicker - MaxDate 属性 设置为 Date - 例如

DTPicker.MaxDate := Date;

但是,有一个问题。如果我现在将日期设置为当前日期:

DTPicker.Date := Date;

不会接受的。控件只是停留在设计时设置的日期。我可以通过将 MaxDate 设置为 Date + 1 然后设置 Date 属性 来解决它工作正常并显示今天的日期,但是用户可以 select 明天的日期。我也尝试将 MaxDate 设置为 Date + 0.99999999 但这也没有帮助。

我使用 Delphi 2010 和 C++Builder 2010(如果这是其中任何一个的错误)。

有什么想法可以防止select输入今天之后的任何日期并将控制日期设置为今天的日期吗?

更改日期结果 - "Failed to set calendar date or time."

更新:

我设法让它工作如下:

  1. 在 TDateTimePicker 中打开下拉菜单(在运行时)并故意 select 今天的日期(点击已经 select 编辑的今天的日期)
  2. 在那之后 select 任何过去的日期
  3. 单击具有重置日期代码的按钮,然后就可以了。

我的解决方案可能是在关闭表单之前使用范围检查,因为看起来 MaxDate 没有用,至少对于这个版本的 Delphi。

看来是 Date 的时间部分导致了问题。这适用于 D2007、XE、XE8 和 Delphi 10 Seattle:

DateTimePicker1.MaxDate := Trunc(Date) + 0.99999999999;
DateTimePicker1.Date := Date;

使用全新的 VCL 表单应用程序进行测试。在表单上放置一个 TDateTimePicker 和一个 TButton,并为表单的 FormCreate 生成一个事件:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DateTimePicker1.MaxDate := Trunc(Date) + 0.99999999999;
end;

和按钮:

procedure TForm1.Button1Click(Sender: TObject);
begin
  DateTimePicker1.Date := Date;
end;

运行 应用程序,单击 DateTimePicker 组合框以显示日历,然后选择任何可用的日期。 DateTimePicker 显示选定的日期。单击该按钮,DateTimePicker 将更新以显示今天的日期。再次下拉日历会显示正确的可用日期。

当然,正如 Remy Lebeau 在评论中指出的那样:在实际应用程序中,您不会希望对时间部分进行硬编码。更好的解决方案是使用 DateUtils.EndOfDay(Date)Trunc(Date) + EncodeTime(23, 59, 59, 999).

加 1 和 0.99999 之间没有太大区别,因为 1 会使日期增加一天,而 0.999999 几乎是一天(类似于 23:59:59:xxx)。

尝试以下操作(您必须在使用列表中包含 DateUtils):

DTPicker.MaxDate := IncSecond(Date);