TDateTimePicker MaxDate - 不允许将控件设置为当前日期
TDateTimePicker MaxDate - does not allow setting control to current date
我已将标准 VCL TDateTimePicker
- MaxDate
属性 设置为 Date
- 例如
DTPicker.MaxDate := Date;
但是,有一个问题。如果我现在将日期设置为当前日期:
DTPicker.Date := Date;
不会接受的。控件只是停留在设计时设置的日期。我可以通过将 MaxDate 设置为 Date + 1
然后设置 Date
属性 来解决它工作正常并显示今天的日期,但是用户可以 select 明天的日期。我也尝试将 MaxDate
设置为 Date + 0.99999999
但这也没有帮助。
我使用 Delphi 2010 和 C++Builder 2010(如果这是其中任何一个的错误)。
有什么想法可以防止select输入今天之后的任何日期并将控制日期设置为今天的日期吗?
更改日期结果 - "Failed to set calendar date or time."
更新:
我设法让它工作如下:
- 在 TDateTimePicker 中打开下拉菜单(在运行时)并故意 select 今天的日期(点击已经 select 编辑的今天的日期)
- 在那之后 select 任何过去的日期
- 单击具有重置日期代码的按钮,然后就可以了。
我的解决方案可能是在关闭表单之前使用范围检查,因为看起来 MaxDate
没有用,至少对于这个版本的 Delphi。
看来是 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 和 0.99999 之间没有太大区别,因为 1 会使日期增加一天,而 0.999999 几乎是一天(类似于 23:59:59:xxx)。
尝试以下操作(您必须在使用列表中包含 DateUtils):
DTPicker.MaxDate := IncSecond(Date);
我已将标准 VCL TDateTimePicker
- MaxDate
属性 设置为 Date
- 例如
DTPicker.MaxDate := Date;
但是,有一个问题。如果我现在将日期设置为当前日期:
DTPicker.Date := Date;
不会接受的。控件只是停留在设计时设置的日期。我可以通过将 MaxDate 设置为 Date + 1
然后设置 Date
属性 来解决它工作正常并显示今天的日期,但是用户可以 select 明天的日期。我也尝试将 MaxDate
设置为 Date + 0.99999999
但这也没有帮助。
我使用 Delphi 2010 和 C++Builder 2010(如果这是其中任何一个的错误)。
有什么想法可以防止select输入今天之后的任何日期并将控制日期设置为今天的日期吗?
更改日期结果 - "Failed to set calendar date or time."
更新:
我设法让它工作如下:
- 在 TDateTimePicker 中打开下拉菜单(在运行时)并故意 select 今天的日期(点击已经 select 编辑的今天的日期)
- 在那之后 select 任何过去的日期
- 单击具有重置日期代码的按钮,然后就可以了。
我的解决方案可能是在关闭表单之前使用范围检查,因为看起来 MaxDate
没有用,至少对于这个版本的 Delphi。
看来是 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 和 0.99999 之间没有太大区别,因为 1 会使日期增加一天,而 0.999999 几乎是一天(类似于 23:59:59:xxx)。
尝试以下操作(您必须在使用列表中包含 DateUtils):
DTPicker.MaxDate := IncSecond(Date);