Delphi:如何使ENTER键在TFrame中用作TAB键

时间:2013-03-11 13:55:53

标签: delphi

我有一个框架和一些控件(编辑,按钮等)。如何拦截在帧控件上任意位置按ENTER键并转换为TAB键(考虑SHIFT状态)?

3 个答案:

答案 0 :(得分:7)

您只需要修改CM_DIALOGKEY的处理。

type
  TMyForm = class(TForm)
  protected
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  end;

procedure TMyForm.CMDialogKey(var Message: TCMDialogKey);
begin
  if Message.CharCode=VK_RETURN then
    Message.CharCode := VK_TAB;
  inherited;
end;

嗯,很明显这是做什么以及如何运作。

你问如何在框架中执行此操作。无法处理框架中的对话框导航。由于相当明显的原因,这是由表单完成的。因此,您需要以某种方式将此代码拼接到托管框架的表单中。

对于备忘录控件,这将无效。他们会将按 ENTER 视为换行符的输入。但我认为这就是你希望发生的事情。否则,备忘录控件将完全无法使用。

答案 1 :(得分:5)

这是一些示例代码,用于处理框架上的消息,以便在按下 Enter 时导航到下一个控件。请注意,此示例不会修改 Enter 键以成为 Tab 键。相反,它选择下一个控件并阻止进一步处理按键消息。

另请注意,代码可能需要进一步调整。一个用于,如果任何控件实际需要处理 Enter 键,例如TMemo,则需要添加例外。其次,导航被包裹在帧中,即在最后一帧控制之后,第一帧控制被聚焦 - 不是对表格的控制而不是对帧的控制。对于这些,您可能希望为消息返回添加条件,如果您希望在某些条件下进行默认处理,只需调用inherited而不执行任何其他操作。

type
  TFrame2 = class(TFrame)
    ...
  protected
    procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
  end;

..

procedure TFrame2.CMChildKey(var Message: TCMChildKey);
begin
  if Message.CharCode = VK_RETURN then begin
    SelectNext(Screen.ActiveControl, not Bool(GetKeyState(VK_SHIFT) and $80), True);
    Message.Result := 1;
  end else
    inherited;
end;

答案 2 :(得分:0)

我认为有很多“昙花一现”的组件,例如http://Torry.net

例如,这样的组件是RxLib的一部分,后来在JediVCL中被TJvEnterAsTab命名。