delphi – 为什么TDateTimePicker.Checked在Windows 7上总是返回
发布时间:2020-12-15 04:30:01 所属栏目:大数据 来源:网络整理
导读:我有一个在Delphi 2007中构建的应用程序,在窗体上有一个TDateTimePicker.此日期时间选择器将ShowCheckbox属性设置为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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |