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

我有一个在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主题

解决方法

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

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

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 API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...