7

我有一个应用程序,在 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?有没有办法以某种方式解决或解决这个问题?

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

4

1 回答 1

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;

因此,您可以创建一个这样的辅助函数来解决错误的 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;
于 2012-10-16T13:13:06.603 回答