【问题标题】:Why does TDateTimePicker.Checked return always True on Windows 7?为什么 TDateTimePicker.Checked 在 Windows 7 上总是返回 True?
【发布时间】:2012-10-06 14:18:26
【问题描述】:

我有一个应用程序,在 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 windows-7 delphi-2007 tdatetimepicker


    【解决方案1】:

    这是 Delphi 日期时间选择器控件实现中的 known issue(在 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;
    

    【讨论】:

    • “已知问题”已在 D2009 中修复。
    • 此解决方法是否存在任何操作系统问题,或者对于 XP、VISTA 和 7 是否同样有效?
    • @bullrider,我从 Windows 7 开始遇到的这个 Delphi 实现问题,但很可能是从 Windows Vista 开始的(但我不确定)。在 Windows XP 中它没有发生。在所有情况下,如果您针对此问题实施任何类型的修复并让您的应用程序在较新的 Windows 版本上正常工作,您会做得更好。
    • @bullrider,啊,我明白你的意思了。不,它不会导致任何错误。此类代码也适用于旧版本的 Windows。该消息(和宏)自 Windows 2000 起可用。
    • @TLama 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多