如何使用更高优先级的TVirtualStringTree进程按键?

时间:2016-10-11 18:26:39

标签: delphi vcl virtualtreeview tvirtualstringtree

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

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

TVirtualStringTree具有输入焦点时,如何使NotificationCenter.default.addObserver(self, selector: Selector(("uploaded")), name: NSNotification.Name(rawValue: "uploaded"), object: nil) 优先,这样它才会响应用户按Enter键之前(最好是代替)将其发送到表单?

1 个答案:

答案 0 :(得分: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属性来拦截其窗口过程。