gpt4 book ai didi

delphi - TDateTimePicker 中的另一个错误?

转载 作者:行者123 更新时间:2023-12-01 18:36:05 24 4
gpt4 key购买 nike

我发现将 TDateTimePicker 的 MaxDate 设置为非零值后,无法将其恢复为零(禁用它)。我的意思是,MaxDate 读数为零,但最大范围对于之前设置的值仍然有效。通过下拉日历并检查最后可见日期可以注意到这一点。

这是另一个错误,还是我不明白如何禁用 MaxDate ?

procedure TForm1.Button1Click(Sender: TObject);
begin
DateTimePicker1.MaxDate:= Date + 10;
DateTimePicker1.MaxDate:= 0;
Caption:= IntToStr(Trunc(Test.MaxDate));
end;

P.S:我首先负责将时间设置为零(这是另一个错误)。

最佳答案

Victoria discovered意外的是Win32 Date and Time Picker control可以通过使用未记录的技巧来重置其范围。

但是,Victoria 的答案在 Delphi 10.2 中不起作用,因为 VCL 包装器的内部 max 和 min 字段未正确重置为 0。将 MinDateMaxDate 属性更改为 0 不起作用——这不会设置 FMinDate由于属性 setter 的实现,FMaxDate 字段变为 0

这将使控制在该点之后发生故障。

解决方法是直接设置字段(我还稍微调整了 Victoria 的逻辑以使代码更简洁):

type
TCommonCalendarHelper = class helper for TCommonCalendar
procedure ResetRangeFields;
end;

TDateTimePickerHelper = class helper for TDateTimePicker
public
procedure ResetRange;
end;

{ TDateTimePickerHelper }

procedure TDateTimePickerHelper.ResetRange;
begin
if DateTime_SetRange(Handle, 0, nil) then
ResetRangeFields;
end;

{ TCommonCalendarHelper }

procedure TCommonCalendarHelper.ResetRangeFields;
begin
with Self do
begin
FMinDate := 0;
FMaxDate := 0;
end;
end;

(令人惊讶的是,with 构造在这里非常必要,请参阅 https://stackoverflow.com/a/42936824/282848 。)

尝试一下:

procedure TForm1.FormClick(Sender: TObject);
begin
DateTimePicker1.MaxDate := IncDay(Now, 4);
// DateTimePicker1.ResetRange; // uncomment to see resetting in action
end;

当然,此代码既依赖于未记录的 Win32 功能,又依赖于 VCL 实现细节。不过,危险可能相当小。请参阅维多利亚帖子的评论,了解有关此主题的更深入的讨论。如果您知道 VCL 版本,则(仅)使用此代码可能是合理的。 (您甚至可以使其不在未来的 VCL 版本上编译。)

关于delphi - TDateTimePicker 中的另一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51858235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com