【问题标题】:TDateTimePicker MaxDate - does not allow setting control to current dateTDateTimePicker MaxDate - 不允许将控件设置为当前日期
【发布时间】:2015-12-21 03:54:18
【问题描述】:

我已将标准 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 中是这样。

【问题讨论】:

  • TDateTimePicker 的开始日期是组件创建的日期+时间。当您在运行时选择另一个日期时,它只会更改日期部分。您不能选择今天,因为组件的时间部分会使整个值 MaxDate 之后。将 MaxDate 设置为 (Tomorrow - 1ms) 或将选取器的初始日期设置为不包括时间部分。
  • MaxDate 为 Today 时不能进入 Today,MaxDate 为 Tomorrow 时可以进入 Tomorrow,这听起来有点奇怪。顺便说一句,我刚刚在 Windows 7 上的 D2010 中对其进行了测试,一切都按预期工作。所以它不太可能是 D2010 中的错误。
  • D2010 肯定有问题。我设法使它工作。这是如何 - 启动程序。有意选择今天的日期。然后选择任何其他日期。然后单击按钮 - 然后相同的代码工作。

标签: delphi date datepicker c++builder tdatetimepicker


【解决方案1】:

看来是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)

【讨论】:

  • 对不起,刚刚在Delphi 2010中试了一下,还是不行。如果我注释掉第一行,它会将日期设置为当前日期,但如果我删除注释,它就不再起作用 - 日期保持在之前设置的任何值并且不会改变。
  • 我刚刚在其他三个 Delphi 版本上进行了测试,它们都运行良好。 ??当您尝试一个全新的项目时会发生什么?
  • 我只是在表单上添加了 TDateTimePicker 和一个 TButton 并添加了按钮 OnClick 事件的代码。运行。将日期更改为星期一。单击按钮 - 重置 - 它什么也不做,停留在星期一的日期。如果我注释掉第一行,那么它将日期重置为今天的日期。这一切看起来都像是 Delphi 2010 中的一个错误,尤其是如果您说它可以在 3 个不同的版本中运行。
  • TDateTimePicker 只是 Windows 公共控件的包装。自推出以来并没有太大变化。
  • 我在 Windows XP 上试用。现在我在 Windows 7 上尝试了相同的操作,它会弹出一条带有红十字的消息 - Failed to set calendar date or time。同样,如果我删除 FormCreate 中的行,它工作得很好,或者如果我将日期设置为 Date + 1。我将不得不得出结论,这是 Delphi 2010 中的某种错误。
【解决方案2】:

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

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

DTPicker.MaxDate := IncSecond(Date);

【讨论】:

  • 感谢您的建议,我也尝试过,但它也不起作用。它看起来像 Delphi 2010 的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2014-05-24
相关资源
最近更新 更多