2016-10-11 31 views
3

我們在工作中得到了一定的搜索表單,最近進行了修改。它的功能是標準搜索表單的功能:在頂部的某些框中輸入一些條件,點擊搜索按鈕,然後在下面的網格中顯示結果。但它的功能很醜,而且功能非常有限,所以我的一位同事在離開新工作之前重建了它。現在我正試圖完成最後的幾個細節。如何使TVirtualStringTree按鍵具有更高的優先級?

其中一項變化是用更強大的TVirtualStringTree替換舊的TListBox網格。但在這個過程中,它似乎已經破壞了一些東西:在之前,如果你點擊了網格中的一行(給網格放置焦點)並且點擊輸入,相應的事件處理程序會觸發並處理你的輸入,打開所選項目的詳細視圖。但是,在此網格中,按輸入會導致TButtonDefault = true屬性形式相反地觸發其OnClick

如何才能使TVirtualStringTree具有輸入焦點時優先,以便它會響應用戶按(輸入本身之前(最好是而不是)將它分配到窗體之前)?

回答

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屬性來截取其窗口過程。

+0

嗯......這可能會工作,但有沒有一種解決方案,不需要修改第三方組件的代碼? –

+0

不客氣。你不需要修改代碼。您可以使用插入器,也可以通過分配給控件的WindowProc屬性來截獲窗口過程。如果你不處理'WM_GETDLGCODE',那麼默認按鈕將會得到消息。你不想要的。 –

+1

哇。我實際上並不知道'WindowProc'屬性是一件事情。原來,這正是我需要解決的問題。謝謝! –

相關問題