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

时间:2015-09-23 17:47:53

标签: delphi date datepicker c++builder tdatetimepicker

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

DTPicker.MaxDate := Date;

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

DTPicker.Date := Date;

它不接受它。控件只停留在设计时设置的日期。我可以通过将MaxDate设置为Date + 1来解决此问题,然后将Date属性设置正常并显示今天的日期,然后用户可以选择明天的日期。我还尝试将MaxDate设置为Date + 0.99999999,但这也无济于事。

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

如何避免选择今天以后的任何日期并将控制日期设置为今天的日期?

更改日期会导致 - "无法设置日历日期或时间。"

更新

我设法使其工作如下:

  1. 在TDateTimePicker中打开下拉列表(在运行时),并有意选择今天的日期(点击已选择的今天的日期)
  2. 之后选择任何过去的日期
  3. 点击按钮,其中包含重置日期的代码,然后可以正常工作。
  4. 我的解决方案可能是在关闭表单之前使用范围检查,因为MaxDate似乎没用,至少对于这个版本的Delphi。

2 个答案:

答案 0 :(得分:2)

似乎是导致问题的Date的时间部分。这适用于D2007,XE,XE8和Delphi 10 Seattle:

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

使用全新的VCL表单应用程序进行测试。在表单上放置TDateTimePickerTButton,并为表单生成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);