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

Re0*_*ess 6 delphi delphi-2007 windows-7 tdatetimepicker

我有一个应用程序,在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;
Run Code Online (Sandbox Code Playgroud)

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

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

PS我的应用程序使用Windows主题

TLa*_*ama 9

这是known issueDelphi日期时间选择器控件的实现(在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;
Run Code Online (Sandbox Code Playgroud)

因此,您可以创建这样的帮助函数来解决错误的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;
Run Code Online (Sandbox Code Playgroud)

  • "已知问题"在D2009中得到修复. (2认同)