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

时间:2012-10-16 13:08:29

标签: delphi windows-7 delphi-2007 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;

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

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

P.S。我的应用程序使用Windows主题

1 个答案:

答案 0 :(得分:9)

这是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;