【问题标题】:How do I make a TVirtualStringTree process key presses with a higher precedence?如何使 TVirtualStringTree 进程具有更高优先级的按键?
【发布时间】:2017-02-20 09:40:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi vcl virtualtreeview tvirtualstringtree


    【解决方案1】:

    处理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 属性来拦截其窗口过程。

    【讨论】:

    • 嗯...这可能可行,但有没有不需要修改第 3 方组件代码的解决方案?
    • 不客气。您无需修改​​代码。您可以使用插入器,也可以通过分配给控件的WindowProc 属性来截取窗口过程。如果您不处理WM_GETDLGCODE,则默认按钮将收到消息。你不想要的。
    • 哇。我实际上不知道 WindowProc 属性是一个东西。事实证明,这正是我需要解决的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多