我已将标准VCL TDateTimePicker
- MaxDate
属性设置为Date
- 例如
DTPicker.MaxDate := Date;
然而,有一个问题。如果我现在将日期设置为当前日期:
DTPicker.Date := Date;
它不接受它。控件只停留在设计时设置的日期。我可以通过将MaxDate设置为Date + 1
来解决此问题,然后将Date
属性设置正常并显示今天的日期,然后用户可以选择明天的日期。我还尝试将MaxDate
设置为Date + 0.99999999
,但这也无济于事。
我使用Delphi 2010和C ++ Builder 2010(如果这是其中任何一个中的错误)。
如何避免选择今天以后的任何日期并将控制日期设置为今天的日期?
更改日期会导致 - "无法设置日历日期或时间。"
更新
我设法使其工作如下:
我的解决方案可能是在关闭表单之前使用范围检查,因为MaxDate
似乎没用,至少对于这个版本的Delphi。
答案 0 :(得分:2)
似乎是导致问题的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 :(得分:2)
添加1和0.99999之间没有什么大的区别,因为1会增加一天到日期,而0.999999几乎会增加一天(类似23:59:59:xxx)。
尝试以下操作(您必须在使用列表中包含DateUtils):
DTPicker.MaxDate := IncSecond(Date);