2

我已将标准 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. 单击具有重置日期代码的按钮,然后它就可以工作了。

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

4

2 回答 2

3

看来这是Date导致问题的时间部分。这在 D2007、XE、XE8 和 Delphi 10 Seattle 上运行良好:

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

使用全新的 VCL 表单应用程序进行了测试。将 aTDateTimePicker和 aTButton放在表单上,​​并为表单生成一个事件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)or Trunc(Date) + EncodeTime(23, 59, 59, 999)

于 2015-09-23T18:01:44.117 回答
2

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

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

DTPicker.MaxDate := IncSecond(Date);
于 2015-09-23T18:13:08.760 回答