2016-10-11 7 views
3

最近改訂された特定の検索フォームがあります。その機能は、標準的な検索フォームの機能です:上部のいくつかのボックスにいくつかの基準を入力し、検索ボタンを押し、結果を下にグリッドで表示します。しかし、それは機能が醜いと非常に限られていたので、私の同僚の1人はそれを再建しました...新しい仕事のために出発する前に。今私は最後のいくつかの詳細を完了しようとしています。優先順位を上げてTVirtualStringTreeプロセスのキーを押すにはどうしたらいいですか?

変更の1つは、古いTListBoxグリッドをより強力なTVirtualStringTreeに置き換えることでした。しかし、このプロセスでは、グリッドの行をクリックしてグリッドにフォーカスを合わせ、を入力した場合は、と入力すると、適切なイベントハンドラが起動し、入力を処理して開きます選択された項目の詳細ビューただし、このグリッドでを入力するとと入力すると、Default = trueプロパティのフォームにTButtonがその代わりにOnClickを発生させます。

TVirtualStringTreeは、入力フォーカスがあるときに優先させることができます。これにより、ユーザーがフォームにディスパッチする前にEnterキーを押すことに応答します。

答えて

5

WM_GETDLGCODEメッセージを処理し、戻り値にDLGC_WANTALLKEYSを含めます。あなたのコントロールは既にこのメッセージを処理し、使用する必要があるかもしれません0以外の何かを返すかどうかに応じて、

procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 

.... 

procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode); 
begin 
    inherited; 
    Message.Result := DLGC_WANTALLKEYS; 
end; 

Message.Result := Message.Result or DLGC_WANTALLKEYS; 

あなたはコードを変更したくない場合たとえば、このクラスの場合は、インターポーザーを使用するか、コントロールのWindowProcプロパティを設定してウィンドウプロシージャをインターセプトします。

+0

ええと...おそらくうまくいくでしょうが、第三者コンポーネントのコードを変更する必要がないソリューションはありますか? –

+0

あなたは大歓迎です。コードを変更する必要はありません。インターポーザーを使うこともできますし、コントロールの 'WindowProc'プロパティに代入することでウィンドウプロシージャをインターセプトすることもできます。 'WM_GETDLGCODE'を処理しないと、デフォルトのボタンがメッセージを取得します。あなたは望みません。 –

+1

うわー。私は実際に 'WindowProc'プロパティが事実であることを知らなかった。それは私がそれを修正するために必要なものであることが判明しました。ありがとう! –

関連する問題