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