6

入力を送信しようとしているカスタムコントロールを作成しました。マウス入力を受け入れ、MouseDown、MouseMove、MouseUpを正しく報告しますが、何らかの理由で、キーボード入力を受け入れません。それをクリックしてもフォーカスが届かず、押したキーは、すでにフォーカスが設定されているコントロールによって解釈されます。

これはおそらく本当に単純なことです。私が最初に見ようと思ったのはControlStyleプロパティでしたが、ヘルプファイルでキーボード入力について確認できるのはcsNoStdEvents、それを無効にするだけで、私のコントロールにはそれがありません。では、コントロールが入力フォーカスを受け取ることができるようにするには、何をする必要がありますか?

4

5 に答える 5

8

試すべきいくつかのこと:

  • MouseDownで、を呼び出しますWindows.SetFocus(Handle)。私の経験では、WinAPI関数はVCLの方法SetFocusよりもうまく機能することがよくあります。SetFocus
  • WM_GETDLGCODEメッセージに応答して、;で返信しますMessage.Result := Message.Result or DLGC_WANTCHARS or DLGC_WANTARROWS or DLGC_WANTTAB or DLGC_WANTALLKEYS
于 2010-05-12T19:37:39.920 に答える
5

マウスを下に向けてSetFocusを呼び出すのと同じくらい簡単でしょうか?

procedure TYourCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
  inherited;

  if CanFocus then
    SetFocus;
end;
于 2010-05-12T19:25:30.677 に答える
2

設定しましたかWS_TABSTOP?それなしではインプットフォーカスはありません、と私は信じています。しかし、これは、私が自分の構文を強調するコードエディタを書いていた10年近く前の思い出に基づいています。そのため、私は長い間ソースを失っています。

{TWinControl.}TabStop := True;すべきです。TWinControl重要なイベントから派生してダイアログを表示する何もしないコンポーネントを備えたクイックテストアプリは、それがすべての違いを生むことを示しているようです。

于 2010-05-12T13:50:49.960 に答える
1

コントロールのコードを確認しましたが、これが機能しなくなる可能性のあるものは何も見つかりません。Createプロシージャで「継承」と呼んでいますか?

私は以下を処理しますが、特別なことは何もありません。

procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;

procedure KeyDown(var Key: Word; Shift: TShiftState); override;
于 2010-05-12T13:34:51.570 に答える
0

キーストロークはフォームレベルで利用できますか?つまり、KeyPreviewがオンになっていて、フォームのOnKeypressイベントでキーストロークを確認できますか?デバッガーでそこから追跡できます。コントロール(ダンが示したように)はキーボード入力に適していますか?たとえば、TLabelはテキストを表示しますが、グラフィカルコントロールです。

于 2010-05-12T13:34:11.283 に答える