3

フレームといくつかのコントロール (編集、ボタンなど) があります。フレーム コントロールの任意の場所で ENTER キーの押下をインターセプトし、TAB キーに変換する方法 (SHIFT ステータスを考慮)。

4

3 に答える 3

7

必要なのは、 の処理を​​変更することだけです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プレスは改行の入力として扱われます。しかし、それはあなたが望んでいることだと思います。そうしないと、メモ コントロールはまったく使用できなくなります。

于 2013-03-11T14:09:43.863 に答える
5

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;
于 2013-03-12T00:39:33.277 に答える
0

たとえばhttp://Torry.netには、それを行うための「落として忘れる」コンポーネントがたくさんあると思います

たとえば、そのようなコンポーネントは RxLib の一部であり、後にTJvEnterAsTab名前を付けて JediVCL に継承されました。

于 2013-03-12T07:33:07.693 に答える