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-Down,则选定文本将变为视图中的文本,然后光标向下移动,窗口向下滚动一行。未选择新的底线。这使它看起来像全选只选择了可见文本。

解决方法是将插入符号移动到 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 回答