gpt4 book ai didi

delphi - TEdit 单击时选择文本,就像 Chrome 和 Firefox 中的 URL 栏一样

转载 作者:行者123 更新时间:2023-12-03 15:51:37 24 4
gpt4 key购买 nike

我想要一个像 Chrome 和 Firefox 中的网址栏一样对点击使用react的 TEdit。第一次单击时,它们会选择所有文本,然后单击会删除选择,如下所示:

enter image description here

我的方法:

// This method is bound to the OnClick event
procedure TForm.edt_SearchClick(Sender: TObject);
begin
if edt_Search.SelLength > 0 then
edt_Search.SelLength := 0
else
edt_Search.SelectAll;
end;

此代码无法按预期工作,因为 edt_Search.SelLength 始终为 0。在触发 OnClick 事件之前,选择始终会被清除。我已经尝试将此代码放入 OnMouseUpOnMouseDown 事件中,但问题仍然相同。

如何解决?有没有办法在不添加额外的 boolean 变量来保存当前状态的情况下执行此操作?

最佳答案

要在控件获得焦点时选择 TEdit 控件中的所有文本,只需处理 OnEnter 事件并:

procedure TForm1.Edit1Enter(Sender: TObject);
begin
PostMessage(Edit1.Handle, EM_SETSEL, 0, -1);
end;

您不能使用Edit1.SelectAll,因为默认行为(发生在OnEnter之后)会清除编辑控件中的所有选择。发布消息可确保在其余默认行为完成后处理该消息。

为了完全模拟这些浏览器中的地址栏,退出控件时该字段也会取消选择,因此在 OnExit 中:

procedure TForm.Edit1Exit(Sender: TObject);
begin
PostMessage(Edit1.Handle, EM_SETSEL, 0, 0);
end;

浏览器字段还允许您在首次输入时选择文本,因此在这种情况下您需要更加小心。作为黑客,您可以使用插入器来完成此操作,但理想情况下您应该制作一个自定义控件:

type
TEdit = class(Vcl.StdCtrls.TEdit)
private
FDoEnterSelect : boolean;
end;

然后

procedure TForm1.Edit1Enter(Sender: TObject);
begin
Edit1.FDoEnterSelect := true;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
PostMessage(Edit1.Handle, EM_SETSEL, 0, 0);
end;

procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Edit1.FDoEnterSelect and
(Edit1.SelLength = 0) then
PostMessage(Edit1.Handle, EM_SETSEL, 0, -1);
Edit1.FDoEnterSelect := false;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Edit1.FDoEnterSelect := false;
end;

KeyUp 处理程序处理按 Tab 键切换到控件的情况。唯一剩下的奇怪情况是编辑控件的 TabOrder 为零,因此在创建表单(并因此选择)时获得焦点。这只会影响第一次单击控件。

关于delphi - TEdit 单击时选择文本,就像 Chrome 和 Firefox 中的 URL 栏一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com