自动允许 Ctrl+A 在 TMemo 中全选?

Posted

技术标签:

【中文标题】自动允许 Ctrl+A 在 TMemo 中全选?【英文标题】:Automatically allowing Ctrl+A to select all in a TMemo? 【发布时间】:2011-12-11 19:24:55 【问题描述】:

在 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;

有什么诀窍可以让我不必执行此程序吗?如果不是,那么这个过程看起来还可以吗?

【问题讨论】:

就我个人而言,我会尽快创建一个从标准备忘录派生的组件并在那里处理按键,这样您就不需要使用特殊处理代码污染所有表单。 @David:您知道多行模式下的标准 Windows 编辑控件是否不允许 Ctrl+A 命令,或者 VCL 包装器是否存在问题? (TEdit 按预期处理 Ctrl+A。) @Andreas 一旦我可以使用带有编译器的机器,我将尝试生成一个原始的 win32 petzold prog 并检查它。 这似乎是一个操作系统问题,没有文档解释。许多关于它的帖子只是基于您自己编写代码 @David:如果我没记错的话,Raymond 会时不时地向他的读者询问要写的东西。这将是一个有趣的话题。 【参考方案1】:

这样更优雅:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ^A then
  begin
    (Sender as TMemo).SelectAll;
    Key := #0;
  end;
end;

【讨论】:

我知道我要讲一点,但你能不能解释一下 ^A 给不熟悉的人(例如我!) Ctrl+A 键击作为序数值为 1 的字符发送(Ctrl+B 为 2,Ctrl+C 为 3,等等)。基本上我认为这是旧时代的残余。这些“字符”通常写成^A^B 等,Delphi 支持这些。您可以在 ASCII 表中看到它们,例如 at Wikipedia。 好多年没看到了,应该是TP天的吧。 @Jerry: 结果不完全一样。您的代码无法处理烦人的“哔”声! @Jerry - AFAIK 无法解决此问题。这是 Windows 编辑控件的默认行为,您可以阅读有关编辑控件的预期行为here。【参考方案2】:

虽然 Andreas Rejbrand 接受的答案是正确的,但这不是预期的 Windows 视觉行为。它使光标位置保持不变。 Ctrl-A(全选)应将光标留在文本底部并滚动控件以使光标可见。

如果不这样做,控件会表现出奇怪的行为。例如,假设文本多于窗口大小,并且窗口没有滚动到底部。您按下 Ctrl-A,所有文本都被选中。 Ctrl-C 现在将所有文本复制到剪贴板。尽管您看不到它,但光标现在位于未滚动的视图底部。如果您现在按下 Ctrl-Down,则选定文本将变为视图中的文本,然后光标向下移动,窗口向下滚动一行。未选择新的底线。这使它看起来像 Select All 只选择了可见文本。

解决方法是将插入符号移到 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 事件。

【讨论】:

【参考方案3】:

我使用前面的答案和讨论创建了一个独立的组件来处理我在小型测试程序中使用的 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;

向表单上的所有组件添加“全选”行为的另一种方法是使用标准全选操作向表单添加操作列表。

【讨论】:

以上是关于自动允许 Ctrl+A 在 TMemo 中全选?的主要内容,如果未能解决你的问题,请参考以下文章

电脑怎么全选文字

Edit Control响应全选(Ctrl+A)

在 Windows 中全选和复制的最有效方法

怎么在网页上用快捷键全选自己想要的内容?

EXCEL表格所有的快捷键是啥?

电脑刷新有啥快捷键?