13

Delphi 7のTMemoコントロールでは、キーコンボを実行してCtrl + Aすべてを選択しようとしても、何も実行されません(すべてを選択しません)。だから私はこの手順を行いました:

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  C: String;
begin
  if ssCtrl in Shift then begin
    C:= LowerCase(Char(Key));
    if C = 'a' then begin
      Memo1.SelectAll;
    end;
  end;
end;

この手順を実行する必要がないようにするためのトリックはありますか?そうでない場合、この手順は問題ないように見えますか?

4

3 に答える 3

29

これはよりエレガントです:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ^A then
  begin
    (Sender as TMemo).SelectAll;
    Key := #0;
  end;
end;
于 2011-12-11T19:30:08.727 に答える
1

Andreas Rejbrandによって受け入れられた答えは正しいですが、それは期待されるWindowsの視覚的動作ではありません。カーソル位置は変更されません。Ctrl-A(すべて選択)は、カーソルをテキストの下部に置き、カーソルが表示されるようにコントロールをスクロールする必要があります。

これが行われない場合、コントロールは奇妙な動作を示します。たとえば、ウィンドウに収まるよりも多くのテキストがあり、ウィンドウが一番下までスクロールされていないとします。Ctrl-Aを押すと、すべてのテキストが選択されます。Ctrl-Cは、すべてのテキストをクリップボードにコピーします。表示されていませんが、カーソルはビューの下部にあり、スクロールされていません。Ctrlキーを押しながら下に押すと、選択したテキストが表示されているテキストだけになり、カーソルが下に移動し、ウィンドウが1行下にスクロールします。新しいボトムラインは選択されていません。これにより、[すべて選択]で表示されているテキストのみが選択されたように見えます。

修正は、SelectAllの前のテキストの最後にキャレットを移動することです。

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ^A then begin
    With Sender as TMemo do begin
      SelStart := Length(Text);
      Perform(EM_SCROLLCARET, 0, 0);
      SelectAll;
    end;
    Key := #0;    //Eat the key to suppress the beep
  end;
end;

'Eat the key'はOnKeyPressイベントでのみ機能し、OnKeyDownまたはOnKeyUpイベントでは機能しないことに注意してください。

于 2021-10-26T14:33:25.203 に答える
0

前の回答と説明を使用して、小さなテストプログラムで使用するKeyPressイベントを処理するスタンドアロンコンポーネントを作成しました。

TSelectMemo = class(TMemo)
protected
  procedure KeyPress(var Key: Char); override;
end;

..。

procedure TSelectMemo.KeyPress(var Key: Char);
begin
  inherited;
  if Key = ^A then
    SelectAll;
end;

フォーム上のすべてのコンポーネントに「すべて選択」動作を追加する別の方法は、標準のすべて選択アクションを使用してアクションリストをフォームに追加することです。

于 2016-10-13T10:54:59.973 に答える