TEdit的onclick事件选中全部文本?

4
当用户单击TEdit1或选择其文本时,如何选择所有文本
格式要求:

每当用户单击TEdit1或选择其文本时,都会自动选择所有文本。


我有点困惑,请澄清一下你的问题。你是想知道如何将TEdit设置为适当的行为,还是想知道如何以编程方式实现它? - menjaraz
4个回答

22
改变 TEdit 控件的默认行为可能会带来很大的风险。你的用户已经熟悉了标准的 Windows 控件行为,任何偏离这种行为的变化都可能造成混乱。
默认情况下,AutoSelect 属性被设置为 True
确定是否在控件获得焦点时自动选择编辑控件中的所有文本。
当单行编辑控件获得焦点时,将 AutoSelect 设置为选择所有文本。此选项仅适用于单行编辑控件。
当用户更有可能替换编辑控件中的文本而不是追加内容时,请使用 AutoSelect
当该属性为 True 时,键盘操作使整个编辑控件的内容被选择。如果控件通过鼠标单击获得焦点,则不会选择所有内容。在这种情况下,您只需按下 CTRL+A 即可选择所有内容。双击会选择鼠标下面的单词。这都是由底层 Windows 控件实现的标准行为。
如果根据当前所选择的答案,在响应 OnClick 事件时更改选择,您将发现使用鼠标单击无法移动插入符。这是极不直观的行为。
这是一个经典例子,说明为什么需要非常小心地更改控件的默认行为。在测试时很容易忽略特定的用例,但当用户使用程序时,他们肯定会找到所有这些问题。
你可以安全地在 OnDblClick 中调用 SelectAll。我认为这样做不会有任何烦人的副作用。
另一种选择是在焦点切换到编辑控件时调用 SelectAll,但不是每次单击控件都会这样做。这可能会感觉有点奇怪,但我个人认为采取这种行动是合理的。如果要这样做,请处理你的编辑控件的 OnEnter 事件。
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  PostMessage(Edit1.Handle, EM_SETSEL, 0, -1);
end;

不错的解释和观点文章。 - Johan
我正想问一个类似的问题,但是先找到了这个。太好了!谢谢你们。 - Capfka

12
当用户点击TEdit1时,如何选择所有文本? 在VCL编辑器中选择Edit1,双击OnClick事件: enter image description here
procedure TForm13.Edit1Click(Sender: TObject);
begin
  Edit1.SelectAll;
end;

您还可以将此事件链接到其他控件,例如按钮。
选择按钮,选择 V 箭头并单击以选择要链接的事件。

在这里输入图片描述

现在,Edit1.OnClickButton1.OnClick 都链接到相同的事件。


这只是一个事件处理程序。必须将其连接到某个地方才能触发它。 - menjaraz
我的意思是连接到 VCL 组件的事件属性。根据其名称,可能是 Edit1,但也可能不是。 - menjaraz
@Johan 你尝试过使用这样的编辑控件吗?试着用鼠标放置插入符号。 - David Heffernan
@DavidHeffernan,我想保持简单,但是加了一个额外的测试,只有在编辑器没有焦点时才执行“selectall”。无论如何,你说得对,这个简单的更改使它不那么烦人了。 - Johan
1
现在把测试放在OnClick中已经太晚了。你能做的最好方法是在OnEnter中向窗口发送选择全部的消息。 - David Heffernan
撤销了编辑,我不想通过postmessage使它过于复杂化。我只是想通常展示如何将代码链接到事件。 - Johan

3

当用户单击TEdit1时,如何选择部分文本:

procedure TForm1.Edit1Click(Sender: TObject);
begin
  Edit1.SelStart:= 1;
  Edit1.SelLength:= 2;
end;

1

你必须使用 OnMouseUp;

procedure cxMRUEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if Button=mbLeft then cxMRUEdit1.SelectAll;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接