我已将标准 VCL TDateTimePicker
- MaxDate
属性设置为 Date
- 例如
DTPicker.MaxDate := Date;
但是,有一个问题。如果我现在将日期设置为当前日期:
DTPicker.Date := Date;
它不会接受它。控件仅停留在设计时设置的日期。我可以通过将 MaxDate 设置为 Date + 1
来解决此问题,然后设置 Date
属性工作正常并显示今天的日期,但用户可以选择明天的日期。我还尝试将 MaxDate
设置为 Date + 0.99999999
但这也没有帮助。
我使用 Delphi 2010 和 C++Builder 2010(如果这是其中任何一个的错误)。
有什么想法可以防止选择今天之后的任何日期并将控制日期设置为今天的日期吗?
更改日期会导致 - “无法设置日历日期或时间。”
更新:
我设法使其工作如下:
- 在 TDateTimePicker 中打开下拉菜单(在运行时)并有意选择今天的日期(点击已选择的今天的日期)
- 然后选择任何过去的日期
- 点击包含重置日期代码的按钮即可生效。
我的解决方案可能是在关闭表单之前使用范围检查,因为看起来 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)
。
关于delphi - TDateTimePicker MaxDate - 不允许将控件设置为当前日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746206/