Delphi:散焦 TDateTimePicker 控件

Delphi: de-focus TDateTimePicker control

提问人:gene b. 提问时间:11/15/2023 最后编辑:AmigoJackgene b. 更新时间:11/15/2023 访问量:103

问:

我的控件存在以下问题:TDateTimePicker

  1. 当表单出现时,它会自动聚焦。这是我对表单的第一个控制,但一切都需要将重点放在启动上。我尝试了以下方法:

    procedure TfrmMain.FormShow(Sender: TObject);
    begin
      // ...
      // Defocus everything
      Self.ActiveControl := nil; // Does not work
    end;
    
    
  2. 此外,还有一个 which 应该使此控件散焦,但按下它不会从 .(其他控件(如常规控件)会将其删除。TSpeedButtonTDateTimePickerTButton

    month selected in DateTimePicker

Delphi 焦点 选择 DateTimePicker

评论

1赞 AmigoJack 11/15/2023
有一个选择,而你有焦点。多个控件可以同时拥有前者,而后者只能用于一个控件。您要删除所选内容,而不是焦点。这是两件截然不同的事情(焦点无法复制到剪贴板)。在早期的 Windows 版本中,焦点更加明显(虚线)。TDateTimePickerTSpeedButton
2赞 Remy Lebeau 11/15/2023
TSpeedButton是一个图形控件,它不能有输入焦点。 并且是窗口控件可以具有输入焦点。TButtonBitBtn
1赞 Andreas Rejbrand 11/15/2023
@AmigoJack:恐怕你在两个方面是不正确的:(1)控件在失去焦点时隐藏了它的选择;日期时间选取器仅在聚焦时显示所选内容。因此,由于 OP 的日期时间选择器具有可见的选择,因此它必须具有键盘焦点。(2) 是一个图形控件,而不是一个窗口控件,所以它不是一个窗口(没有 HWND),它不能有焦点。TDateTimePickerTSpeedButton
0赞 AmigoJack 11/15/2023
@RemyLebeau 是的,你是对的。屏幕截图可能显示了鼠标光标。我认为使用 DTM_GETDATETIMEPICKERINFO 设置编辑控件ES_NOHIDESEL应该是可能的,但它不起作用,因为它不是永久控件(是我期望在任何编辑控件上使用的功能)。TEdit.HideSelection

答:

2赞 SilverWarior 11/15/2023 #1

可以将其 TabStop 属性设置为 false,以防止它获得初始焦点。

请注意,这也将阻止用户使用该键将焦点转移到 以及。TABTDateTimePicker

按 a 不会将焦点从 的 上移开的原因是它不是可聚焦的控件。TSpeedButtonTDateTimePickerTSpeedButton

评论

1赞 Andreas Rejbrand 11/15/2023
(但我会避免使用键盘导航 GUI 的任何应用程序。
4赞 Andreas Rejbrand 11/15/2023 #2

当表单出现时,它会自动聚焦。这是我对表单的第一个控制,但一切都需要将重点放在启动上。

这是一个非常奇怪的要求。我的直觉是你的设计是次优的。你不应该与操作系统及其惯例作斗争——你应该努力遵守用户在平台上期望的规范。

此外,还有一个 which 应该使此控件散焦,但按下它不会从 .TSpeedButtonTDateTimePicker

这是意料之中的,因为这是一个图形控件,而不是窗口控件。因此,速度按钮不是窗口(就像常规按钮、编辑框、单选按钮、复选框、组合框、列表框、列表视图等一样)。TSpeedButton

特别是,这意味着用户无法使用键盘 (Tab) 移动到您的按钮,因此速度按钮会使您的 GUI 更难访问且使用起来不太方便。

出于这个原因,我从不使用速度按钮。

一切都需要将注意力转移到启动上

但如果你绝对坚持,你可以从一开始就让一切散焦。

您只需要添加一个处理程序,将表单设置为:OnActivateActiveControlnil

procedure TForm1.FormActivate(Sender: TObject);
begin
  ActiveControl := nil
end;

评论

0赞 gene b. 11/15/2023
是的,在工作。我的错误是我在 .多谢!ActiveControl := nilOnActivateOnShow