我有一个在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主题
答案 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;