3

我们最近修改了一个特定的搜索表单。它的功能是标准搜索表单的功能:在顶部的某些框中输入一些条件,点击“搜索”按钮,然后在下方的网格中显示结果。但它很丑而且功能非常有限,所以我的一个同事重建了它……就在去换新工作之前。现在我正在尝试完成最后几个细节。

其中一项更改是用TListBox更强大的TVirtualStringTree. 但是在这个过程中,它似乎破坏了一些东西:之前,如果您单击网格中的一行(使网格处于放置焦点)并点击Enter,相应的事件处理程序将触发并处理您的输入,打开详细视图对于所选项目。然而,在这个网格中,按下Enter会导致TButton带有属性的表单上的Default = true触发它OnClick

当它具有输入焦点时,我怎样才能使其TVirtualStringTree优先,以便它在将其发送到表单之前(最好而不是)响应用户按下 Enter 本身?

4

1 回答 1

5

处理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;

根据您的控件是否已经处理此消息并返回0您可能需要使用的内容:

Message.Result := Message.Result or DLGC_WANTALLKEYS;

如果您不想修改此类的代码,请使用插入器或设置WindowProc控件的属性以拦截其窗口过程。

于 2016-10-11T18:40:48.637 回答