【问题标题】:Delphi Getting 'Ctrl Tab' and 'Ctrl Shift Tab' in applicationDelphi 在应用程序中获取“Ctrl Tab”和“Ctrl Shift Tab”
【发布时间】:2011-01-19 20:19:08
【问题描述】:

在我的应用程序中,我使用选项卡,我自己的组件,比如 Google chrome。每个选项卡都引用一个资源管理器组件,因此它基本上是一个选项卡式浏览器/资源管理器。我的问题是我想使用 CTRL+ TABCTRL+SHIFT +TAB kbd> 导航选项卡。设置 forms.KeyPreview 将无济于事,因为 tab 键是特殊键。我怎样才能以一种简单的方式添加对我的导航愿望的支持。如果需要,我可以修改组件。如果有帮助,我的组件基于 TCustomControl。

亲切的问候 罗伊·M·克莱弗

【问题讨论】:

    标签: delphi user-interface navigation tabs components


    【解决方案1】:

    您可以在您的组件中管理CM_DIALOGKEY消息来拦截Ctrl + TabCtrl + Shift + 制表符

    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
    

    检查此示例

    procedure TYourComponent.CMDialogKey(var Message: TCMDialogKey);
    begin
      if (Focused) and (Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
      begin
       if GetKeyState(VK_SHIFT) then
        GoBackwardPage()//you must write this method
       else
        GoForwardPage()//you must write this method
        Message.Result := 1;
      end
       else
        inherited;
    end;
    

    【讨论】:

    • 我现在差不多就是这样:) 谢谢!
    【解决方案2】:

    Tab 和方向键一样,enter 和 escape 是对话框导航中使用的特殊键。当控件想要接收这些键时,它必须通过响应WM_GETDLGCODE 来表明这一点。就像下面的这段代码。然后当 Tab 被按下时你会收到一个 KeyDown 事件。

    procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
    
    procedure TYourControl.WMGetDlgCode(var Msg: TWMGetDlgCode);
    begin
     inherited;
     Msg.Result := Msg.Result or DLGC_WANTTAB;
    end;
    

    另见herehere

    PS:并确保您的控件具有焦点,否则您将一无所获(如果 CanFocus 则 SetFocus;在 MouseDown 中)。

    【讨论】:

    • 嗯,这帮助我走上了正轨……我的资源管理器中有一些代码阻止了键在某些条件下工作。现在我让它工作了。谢谢!
    猜你喜欢
    • 2010-10-23
    • 2013-03-06
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多