Delphi 为什么TDateTimePicker.Checked在Windows 7上总是返回True?

Delphi 为什么TDateTimePicker.Checked在Windows 7上总是返回True?,delphi,windows-7,delphi-2007,tdatetimepicker,Delphi,Windows 7,Delphi 2007,Tdatetimepicker,我有一个在Delphi2007中构建的应用程序,表单上有一个TDateTimePicker。此日期时间选择器的ShowCheckbox属性设置为True,在日期或时间旁边显示一个复选框,每当用户选择日期或代码更改日期或时间时,都会自动选中该复选框。此复选框的状态也可由用户手动控制,其状态可由Checked属性确定 以下代码显示了如何在OnChange事件中确定此复选框的状态: procedure TForm1.FormCreate(Sender: TObject); begin DateTi

我有一个在Delphi2007中构建的应用程序,表单上有一个
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主题

这是Delphi中日期时间选择器控件的实现(在Delphi 2009中修复,正如@Remy在其评论中指出的)。若要查询日期时间选择器的状态,应使用message或内部发送此消息的宏复选框。如果消息(或宏)返回
GDT\u VALID
值,并且使用了样式(在Delphi中,当属性为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;

“已知问题”已在D2009中修复。此解决方案是否存在操作系统问题,或者它是否适用于XP、VISTA和7?@bullrider,这是我自Windows 7以来遇到的Delphi实现问题,但很可能是自Windows VISTA以来出现的(但我不确定)。在Windows XP中,这并没有发生。在所有情况下,如果您对这个问题实施任何类型的修复,并使您的应用程序在较新的Windows版本中正常工作,您会做得更好。@bullrider,啊,我明白您的意思了。不,它不会引起任何问题。这种代码也适用于旧版本的Windows。该消息(和宏)从Windows 2000开始提供。@TLama非常感谢!