gpt4 book ai didi

delphi - 为什么 TDateTimePicker.Checked 在 Windows 7 上始终返回 True?

转载 作者:行者123 更新时间:2023-12-03 14:58:50 25 4
gpt4 key购买 nike

我有一个用 Delphi 2007 构建的应用程序,表单上有一个 TDateTimePicker。此日期时间选择器的 ShowCheckbox 属性设置为 True,它在日期或时间旁边显示一个复选框,每当用户选择日期时都会自动选中该复选框,或者当日期或时间被代码更改时。该复选框的状态也可以由用户手动控制,其状态可以由 Checked 属性确定。

以下代码显示如何在 OnChange 事件中确定此复选框的状态:

procedure TForm1.FormCreate(Sender: TObject);
begin
DateTimePicker1.ShowCheckbox := True;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
ShowMessage('Checked: ' + BoolToStr(DateTimePicker1.Checked, True));
end;

上述代码在 Windows XP 上按预期工作,但在 Windows 7 上,Checked 属性始终返回 True,无论该复选框的实际状态如何。

为什么即使复选框未选中,Checked 属性也始终返回 True?有没有办法以某种方式修复或解决这个问题?

附注我的应用程序使用 Windows 主题

最佳答案

这是一个known issue在 Delphi 日期时间选择器控件的实现中(在 Delphi 2009 中修复,正如 @Remy 在他的评论中指出的那样)。要查询日期时间选择器的状态,应使用 DTM_GETSYSTEMTIME 复选框。消息,或 DateTime_GetSystemtime宏,它在内部发送此消息。如果消息(或宏)返回 GDT_VALID 值,并且 DTS_SHOWNONE使用样式(在 Delphi 中,当 ShowCheckbox 属性为 True 时),它表示该控件的复选框已选中并且该控件包含有效的日期时间。

以下是如何使用上述宏来确定复选框状态的示例:

uses
CommCtrl;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
SysTime: SYSTEMTIME;
begin
if DateTime_GetSystemTime(DateTimePicker1.Handle, @SysTime) = GDT_VALID then
ShowMessage('Check box is checked!')
else
ShowMessage('Check box is not checked!');
end;

因此,您可以创建一个像这样的辅助函数来解决错误的 Delphi 实现:

uses
CommCtrl;

function IsDateTimePickerChecked(ADateTimePicker: TDateTimePicker): Boolean;
var
SysTime: SYSTEMTIME;
begin
Result := DateTime_GetSystemTime(ADateTimePicker.Handle, @SysTime) = GDT_VALID;
end;

procedure TMyForm.ButtonOneClick(Sender: TObject);
begin
if IsDateTimePickerChecked(DateTimePicker1) then
ShowMessage('Check box is checked!')
else
ShowMessage('Check box is not checked!');
end;

关于delphi - 为什么 TDateTimePicker.Checked 在 Windows 7 上始终返回 True?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915431/

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