フレームといくつかのコントロール (編集、ボタンなど) があります。フレーム コントロールの任意の場所で ENTER キーの押下をインターセプトし、TAB キーに変換する方法 (SHIFT ステータスを考慮)。
3 に答える
必要なのは、 の処理を変更することだけですCM_DIALOGKEY
。
type
TMyForm = class(TForm)
protected
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
end;
procedure TMyForm.CMDialogKey(var Message: TCMDialogKey);
begin
if Message.CharCode=VK_RETURN then
Message.CharCode := VK_TAB;
inherited;
end;
これが何をし、どのように機能するかは明らかです。
フレームでこれを行う方法を尋ねます。フレーム内でダイアログ ナビゲーションを処理することはできません。これは、かなり明白な理由でフォームによって行われます。したがって、フレームをホストするフォームにこのコードを接続する必要があります。
メモ コントロールの場合、これは効果がありません。ENTERプレスは改行の入力として扱われます。しかし、それはあなたが望んでいることだと思います。そうしないと、メモ コントロールはまったく使用できなくなります。
Enterが押されたときに次のコントロールに移動できるようにフレーム上のメッセージを処理するサンプルコードを次に示します。このサンプルでは、Enterキーがキーになるように変更されていないことに注意してくださいTab。代わりに、次のコントロールを選択し、キーダウンメッセージのそれ以上の処理を防ぎます。
また、コードをさらに微調整する必要がある場合があることにも注意してください。1つは、コントロールのいずれかが実際にEnterキーを処理する必要がある場合、たとえば、、TMemo
例外を追加する必要があるためです。次に、ナビゲーションはフレームにラップされます。つまり、最後のフレームコントロールの後、最初のフレームコントロールがフォーカスされます。フォームやフレームのコントロールではありません。これらの場合、メッセージを返すための条件を追加することをお勧めします。ある条件でデフォルトの処理が必要な場合は、他に何もせずに単にinheritedを呼び出します。
type
TFrame2 = class(TFrame)
...
protected
procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
end;
..
procedure TFrame2.CMChildKey(var Message: TCMChildKey);
begin
if Message.CharCode = VK_RETURN then begin
SelectNext(Screen.ActiveControl, not Bool(GetKeyState(VK_SHIFT) and $80), True);
Message.Result := 1;
end else
inherited;
end;
たとえばhttp://Torry.netには、それを行うための「落として忘れる」コンポーネントがたくさんあると思います
たとえば、そのようなコンポーネントは RxLib の一部であり、後にTJvEnterAsTab
名前を付けて JediVCL に継承されました。