覆盖单个Object的Tab控件

时间:2014-08-18 11:05:47

标签: delphi delphi-xe5

我发现这段代码会覆盖整个类:

{ Private declarations }
  procedure CMDialogKey(Var Msg: TWMKey) ;
  message CM_DIALOGKEY;

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
  if (ActiveControl is TEdit) and (Msg.Charcode = VK_TAB) then
  begin
   //
  end else
    inherited;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage('Tab is Pressed!');
end;

哪个适用(适用于整个班级)。

我可以使用一些易于理解的代码(我是一名初学程序员)吗?或者我可以更改上面的代码以满足我的需求吗?

2 个答案:

答案 0 :(得分:2)

继续发表评论后,您要问的一种方法是使用每个VCL控件都具有的Tag属性。您可以定义一个常量:

const MOVE_NEXT = 123; 

然后,在设计器中,选择TabSheet中的哪个控件作为触发页面更改的最终控件,并将其Tag属性设置为123。理想情况下,这很可能是页面上具有最高TabOrder的控件。当然,您也可以通过编程方式执行此操作。

enter image description here

在你的方法中,然后:

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
  if (ActiveControl.Tag = MOVE_NEXT) and
     (Msg.Charcode = VK_TAB) and
     (PageControl1.ActivePageIndex < PageControl1.PageCount - 1) then
  begin
    PageControl1.ActivePageIndex := PageControl1.ActivePageIndex + 1;
    Msg.Result := 1;
    // note : it is good practice to set the message result to 1 
    // to indicate that you have handled the message.
  end else
    inherited;
end;

上述方法将导致TAB键在其所有页面中循环,在所包含的控件所指示的TabOrder中的每个控件上着陆。 Tag 123属性的控件将触发选择下一个标签。在编写时,它将循环遍历页面控件一次,然后离开窗体上的下一个控件。

当然,在下一个周期中,PageControl将保留在其最后一页上,Tab键将在最后一页上循环显示控件,然后再继续。您可以通过执行与表单上前面的TabOrder控件类似的操作,将页面控件重置为每次第一页 - 例如:

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
  if (ActiveControl.Tag = MOVE_NEXT) and
     (Msg.Charcode = VK_TAB) and
     (PageControl1.ActivePageIndex < PageControl1.PageCount - 1) then
  begin
    PageControl1.ActivePageIndex := PageControl1.ActivePageIndex + 1;
    Msg.Result := 1;
    Exit;
  end;

  // define new const MOVE_FIRST = 124 
  if (ActiveControl.Tag = MOVE_FIRST) and (Msg.Charcode = VK_TAB) then
  begin
    PageControl1.ActivePageIndex := 0;
    PageControl1.SetFocus;
    Msg.Result := 1;
    Exit;
  end;

  inherited;
end;

答案 1 :(得分:2)

虽然@J ... sugestion会起作用但它并不直观,因为您必须在PageControll上的特定页面上的每个控件上进行制表。 尝试通过大约50个组件进行制表,你会明白我的意思。没有任何形式有这么多组件。然后打开一个网页并使用TAB键在构成网页的不同控件之间移动。

那么为什么不使用特定的组合键来快速浏览PageControll的页面,如CTRL + TAB,它在许多支持多个选项卡(大多数Web浏览器)的程序中使用,甚至可以处理多个文档(旧版本的Microsoft Word, Curent版本的Microsoft Excel等。)

事实上,这个功能是否已经在Page Controll中实现了?