6

私が達成しようとしていること:

  • ユーザーが TMemo ボックスにテキストを入力する
  • Enter キーを押すと、新しい行が作成されます
  • Ctrl+を押すEnterと、テキストが別のボックスに移動し、TMemo が空になります。

私はこのコードを使用しています [KeyPreview is True]:

procedure TFMsg.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Shift = [ssCtrl]) and (Key = $0D) then
  begin
    Key := 0;
    btnSendClick(Sender); //this moves the text and empties the TMemo box
  end;
end;

実際に起こっていること:

  • Ctrl+Enterテキストを他のボックスに送信します
  • TMemo は空になりますが、カーソルが 2 行目に点滅しているため、Enter キーを受け入れるようです。

感謝して受け取った助け。ありがとうございました!

4

3 に答える 3

7

これを処理する最良の方法は次のとおりです。

  1. アクション リストまたはアクション マネージャを作成するか、既存のものを再利用します。
  2. メモをクリアして次のメモに移動するアクションを追加します。アクティブなコントロールが本当にメモであることを確認する必要があります。
  3. アクションに希望するショートカットCTRL+を与えますENTER

アクションを何かにアタッチする必要がないことに注意してください。ショートカットが確実に処理されるようにするには、存在するだけで十分です。

修飾キーを使用する複合キーボード アクションの場合は、アクション ショートカットを使用するのが常に最も簡単なので、下位レベルのキーボード処理コードから距離を置いてください。

アクション ハンドラは次のようになります。

if ActiveControl is TMemo then
begin
  Memo := TMemo(ActiveControl);
  Text := Memo.Text;
  Memo.Clear;
  SelectNext(Memo, True, True);
  if ActiveControl is TMemo then
  begin
    Memo := TMemo(ActiveControl);
    Memo.Text := Text;
  end;
end;

このコードでは、複数のメモがあり、テキストがタブ オーダーで 1 つのメモから次のメモに移動されると想定しています。しかし、ニーズは異なる場合があります。その場合、シナリオで何をする必要があるかは明らかです。

于 2013-07-24T10:52:09.307 に答える
0

そのためにメモの OnKeyPress イベントを使用します。

procedure TFMsg.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key=#10) and (GetKeyState(VK_CONTROL)<0) then
    begin
      key:=#0;
      btnSendClick(Sender);
    end;
end;

キャリッジ リターン (#13) ではなく、ライン フィード (#10) をチェックする必要があることに注意してください。

于 2014-03-19T11:36:13.413 に答える