【问题标题】:ECommonCalendarError: Failed to set calendar date or timeECommonCalendarError: 未能设置日历日期或时间
【发布时间】:2018-07-30 14:03:31
【问题描述】:

我启动了一个新的 Delphi 应用程序,我在主窗体上删除了 TDateTimePicker,并添加了以下代码:

procedure TForm1.FormShow(Sender: TObject);
begin
 DateTimePicker1.MaxDate:= Now - 9;
 DateTimePicker1.Date:= Now - 10;
end;

当我运行程序并尝试使用键盘上的UP ARROW 更改日期时,我收到此错误消息。但是,如果我将带有 MOUSE 的日期更改为最后可能的日期,我不会收到错误消息。之后,我也可以使用箭头键更改日期。

我不明白出了什么问题以及如何解决这个问题。

更新: 发生该错误时,我发现了另一种情况:当我下拉列表并再次关闭它时,没有选择任何内容,但使用以下设置:

procedure TForm1.FormShow(Sender: TObject);
var D:TDate;
begin
 D:= Date;
 DateTimePicker1.Date:= D;
 DateTimePicker1.MaxDate:= D;
end;

【问题讨论】:

  • 这是一个 VCL 错误,已在后续版本中修复。在CNNotify 方法中,当DTN_DATETIMECHANGE 通知到达时缺少FChanging 标志的设置。
  • 根本问题是DTM_SETSYSTEMTIME 由于现有时间部分(与最大日期时间重叠)而无法设置日期时间。
  • 我对此无能为力吗?一种解决方法或其他东西...... :(如果我能以某种方式触发我用鼠标选择日期时发生的事情......在我这样做之后,一切正常......
  • 您可以修改VCL源或外部使用例如intercept class like this.
  • 这是相同的潜在问题。当仅设置Date 属性时,日期部分被替换,但时间仍然存在(并且将这么长的日期和时间传递给DateTime_SetSystemTime 宏,由于溢出最大限制导致该异常而失败)。解决这两个问题的一种方法是将Time 归零,或设置DateTime 属性而不是Date

标签: delphi runtime-error delphi-2009


【解决方案1】:

Delphi 2009 VCL 中有一个错误。问题是 MaxDate 属性的设置器没有将 23:59:59 的时间部分添加到最大范围限制。然后,当一个人离开 Time 属性的时间不同于 00:00:00 并仅设置 Date 属性时,DateTime_SetSystemTime 宏由于日期时间范围的日期时间溢出而失败(这导致了该异常)。

为避免这种情况,您可以将 Time 属性重置为 00:00:00,或仅将日期(保持时间部分归零)分配给 DateTime 属性。

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 2011-06-06
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多