如何使 TVirtualStringTree 处理具有更高优先级的按键?
How do I make a TVirtualStringTree process key presses with a higher precedence?
我们最近改进了一个特定的搜索表单。它的功能是标准搜索表单的功能:在顶部的一些框中输入一些条件,点击“搜索”按钮,然后在下方的网格中显示结果。但是它很丑而且功能非常有限,所以我的一位同事重建了它……就在离开新工作之前。现在我正在尝试完成最后几个细节。
其中一项更改是用更强大的 TVirtualStringTree
替换旧的 TListBox
网格。但在这个过程中,它似乎破坏了某些东西:之前,如果您单击网格中的一行(将焦点置于网格中)并按下 Enter,相应的事件处理程序将触发并处理您的输入,打开所选项目的详细视图。但是,在这个网格中,按 Enter 会导致带有 Default = true
属性 的表单上的 TButton
改为触发其 OnClick
。
如何让 TVirtualStringTree
在输入焦点时优先,以便它在将其发送到表单之前(最好不是)响应用户按 Enter 本身?
处理 WM_GETDLGCODE
消息并在返回值中包含 DLGC_WANTALLKEYS
。例如:
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
....
procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := DLGC_WANTALLKEYS;
end;
取决于您的控件是否已经处理此消息和 returns 除 0
之外的其他内容,您可能需要使用:
Message.Result := Message.Result or DLGC_WANTALLKEYS;
如果您不想修改此 class 的代码,则使用插入器或设置控件的 WindowProc
属性 以拦截其 window程序。
我们最近改进了一个特定的搜索表单。它的功能是标准搜索表单的功能:在顶部的一些框中输入一些条件,点击“搜索”按钮,然后在下方的网格中显示结果。但是它很丑而且功能非常有限,所以我的一位同事重建了它……就在离开新工作之前。现在我正在尝试完成最后几个细节。
其中一项更改是用更强大的 TVirtualStringTree
替换旧的 TListBox
网格。但在这个过程中,它似乎破坏了某些东西:之前,如果您单击网格中的一行(将焦点置于网格中)并按下 Enter,相应的事件处理程序将触发并处理您的输入,打开所选项目的详细视图。但是,在这个网格中,按 Enter 会导致带有 Default = true
属性 的表单上的 TButton
改为触发其 OnClick
。
如何让 TVirtualStringTree
在输入焦点时优先,以便它在将其发送到表单之前(最好不是)响应用户按 Enter 本身?
处理 WM_GETDLGCODE
消息并在返回值中包含 DLGC_WANTALLKEYS
。例如:
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
....
procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := DLGC_WANTALLKEYS;
end;
取决于您的控件是否已经处理此消息和 returns 除 0
之外的其他内容,您可能需要使用:
Message.Result := Message.Result or DLGC_WANTALLKEYS;
如果您不想修改此 class 的代码,则使用插入器或设置控件的 WindowProc
属性 以拦截其 window程序。