我有一个框架和一些控件(编辑,按钮等).如何拦截在帧控件上任意位置按ENTER键并转换为TAB键(考虑SHIFT状态)?
您只需要修改处理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;
Run Code Online (Sandbox Code Playgroud)
嗯,这很明显是什么以及它是如何工作的.
你问如何在一个框架中这样做.无法处理框架中的对话框导航.由于相当明显的原因,这是由表单完成的.因此,您需要以某种方式将此代码拼接到托管框架的表单中.
对于备忘录控件,这将不起作用.他们会将按压ENTER视为换行输入.但我认为这就是你希望发生的事情.否则,备忘录控件将完全无法使用.
下面是一些示例代码,用于处理帧上的消息,以便在Enter按下时能够导航到下一个控件.请注意,此示例不会将Enter密钥修改为Tab密钥.相反,它选择下一个控件并阻止进一步处理按键消息.
另请注意,代码可能需要进一步调整.一个用于,如果任何控件实际需要处理Enter密钥,例如a 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4086 次 |
| 最近记录: |