Delphi在应用程序中获取“Ctrl Tab”和“Ctrl Shift Tab”

时间:2010-02-22 21:50:02

标签: delphi user-interface navigation tabs components

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

亲切的问候 Roy M Klever

2 个答案:

答案 0 :(得分:5)

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中)。

答案 1 :(得分:4)

您可以管理组件中的CM_DIALOGKEY消息,以拦截 Ctrl + Tab Ctrl + 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;