输入框焦点和光标的问题

时间:2022-12-06 19:43:03
有两个TEdit,开始焦点在Edit1中
点击Edit2,焦点从Edit1跳到Edit2,
此时触发Edit1的OnExit事件,在处理过程中显示一个模式窗口用于显示处理进度,处理结束后这个模式窗口会自动关闭。
但是,发现Edit2并未获得输入焦点。

如果在OnExit中关闭模式窗口后调用Edit2.SetFocus
输入焦点确实在Edit2中可以输入文本,但是不显示光标。
从Edit2中离开时也不会触发其OnExit事件。

这种情况下,怎么让Edit2能够显示光标,并且在离开时触发OnExit事件呢?
除了SetFocus之外,是不是还要发送什么消息啊!?
用的是Delphi 7

15 个解决方案

#1


up..

#2


检查一下EDIT所在的form的OnActivate事件,那个进度窗口关闭后,回到原窗口时触发了该事件

#3


Edit1的onExit事件中:

Edit2.SetFocus;
Edit2.SelLength:=0;
Edit2.SelStart:=length(Edit1.Text);

#4


赞同smiler007(笑一笑)

#5


dongliu(竹子)的方法无效,已经试过:(
其实输入焦点还是在Edit2中的,此时输入文本也会正常显示。
但是似乎没有DoEnter,所以之后也不会触发OnExit事件。

进度窗口是自动关闭的,不会触发form的OnActivate事件。
smiler007(笑一笑)的提示也没用。

做了一个很简单的窗口,就两个Edit和一个会自动关闭的弹出窗口。
两个Edit的OnExit用同一个处理
procedure TForm1.Edit2Exit(Sender: TObject);
var
  newFocus: TWinControl;
begin
  form3.ShowModal;
end;
会发现一个很有趣的现象。
第一次从Edit1跳到Edit2,触发OnExit,光标正常但是无法输入
从Edit2跳回Edit1,触发OnExit,光标也回到Edit1,还是无法输入
再次试图跳到Edit2,光标并不过来,也不触发OnExit,并且选择Edit2的文本,Edit1的光标会跟着走!
是不是Delphi的一个Bug?还是OnExit事件的代码有什么限制条件。
怀疑焦点转换的顺序有问题。

#6


按理form的OnActivate事件应该出现,现在没出现,说明form没有被激活,要写api激活它

#7


to fjx99(fjx99)
这个可能和窗口显示的方式有关系
用ShowModal来显示,form1窗口的焦点其实没有被移走,
form3应该相当于form1内嵌的一个控件
试了在代码中form1.SetFocus,结果还是一样:(

#8


记得以前有位老兄提出过这问题 
好像是delphi的bug

#9


发现Edit2并未获得输入焦点?
控制onkeypress可以的

#10


procedure TForm1.Edit1Exit(Sender: TObject);
var
  f:tform;
begin
  f := tform.Create(self);
  f.ShowModal;
end;
我试过,可以啊,是不是你的modal窗口有问题

#11


to: flyinwuhan(制怒·三思而后行)
看来是bug,有没有相关补丁?

to: whbo(王红波)
不能在OnKeyPress中处理,那样会频繁修改另外一个模块属性。
我是想在新属性完全输入之后将修改一次提交过去。

to: XuDunYu(西门吹雪)
你用的什么版本的?
我用application.messagebox也有问题

#12


没有听说。。。。。相关补丁

创建modal窗口有两种办法,一种是application.createform(...
另一种是:f:tform;
begin
  f := tform.Create(self);
  f.ShowModal;
你试一下第二种有没有问题?

#13


to: whbo(王红波)
不能在OnKeyPress中处理,那样会频繁修改另外一个模块属性。
我是想在新属性完全输入之后将修改一次提交过去。
//可以让这个onKeyPress成为共用的事件

#14


我也碰到过,可能是个BUG
建议不要用模式窗体显示进程,在同一窗体显示就没有问题,主要是避免在ONEXIT事件里弹出窗口.

#15


嗯,看来只能放弃模式窗口了。
留待以后研究。

还发现一个有趣的情况。这样跳转到Edit2的时候,如果点击右键显示弹出菜单,然后取消,
还是有可能让Edit2恢复到正常状态的。

#1


up..

#2


检查一下EDIT所在的form的OnActivate事件,那个进度窗口关闭后,回到原窗口时触发了该事件

#3


Edit1的onExit事件中:

Edit2.SetFocus;
Edit2.SelLength:=0;
Edit2.SelStart:=length(Edit1.Text);

#4


赞同smiler007(笑一笑)

#5


dongliu(竹子)的方法无效,已经试过:(
其实输入焦点还是在Edit2中的,此时输入文本也会正常显示。
但是似乎没有DoEnter,所以之后也不会触发OnExit事件。

进度窗口是自动关闭的,不会触发form的OnActivate事件。
smiler007(笑一笑)的提示也没用。

做了一个很简单的窗口,就两个Edit和一个会自动关闭的弹出窗口。
两个Edit的OnExit用同一个处理
procedure TForm1.Edit2Exit(Sender: TObject);
var
  newFocus: TWinControl;
begin
  form3.ShowModal;
end;
会发现一个很有趣的现象。
第一次从Edit1跳到Edit2,触发OnExit,光标正常但是无法输入
从Edit2跳回Edit1,触发OnExit,光标也回到Edit1,还是无法输入
再次试图跳到Edit2,光标并不过来,也不触发OnExit,并且选择Edit2的文本,Edit1的光标会跟着走!
是不是Delphi的一个Bug?还是OnExit事件的代码有什么限制条件。
怀疑焦点转换的顺序有问题。

#6


按理form的OnActivate事件应该出现,现在没出现,说明form没有被激活,要写api激活它

#7


to fjx99(fjx99)
这个可能和窗口显示的方式有关系
用ShowModal来显示,form1窗口的焦点其实没有被移走,
form3应该相当于form1内嵌的一个控件
试了在代码中form1.SetFocus,结果还是一样:(

#8


记得以前有位老兄提出过这问题 
好像是delphi的bug

#9


发现Edit2并未获得输入焦点?
控制onkeypress可以的

#10


procedure TForm1.Edit1Exit(Sender: TObject);
var
  f:tform;
begin
  f := tform.Create(self);
  f.ShowModal;
end;
我试过,可以啊,是不是你的modal窗口有问题

#11


to: flyinwuhan(制怒·三思而后行)
看来是bug,有没有相关补丁?

to: whbo(王红波)
不能在OnKeyPress中处理,那样会频繁修改另外一个模块属性。
我是想在新属性完全输入之后将修改一次提交过去。

to: XuDunYu(西门吹雪)
你用的什么版本的?
我用application.messagebox也有问题

#12


没有听说。。。。。相关补丁

创建modal窗口有两种办法,一种是application.createform(...
另一种是:f:tform;
begin
  f := tform.Create(self);
  f.ShowModal;
你试一下第二种有没有问题?

#13


to: whbo(王红波)
不能在OnKeyPress中处理,那样会频繁修改另外一个模块属性。
我是想在新属性完全输入之后将修改一次提交过去。
//可以让这个onKeyPress成为共用的事件

#14


我也碰到过,可能是个BUG
建议不要用模式窗体显示进程,在同一窗体显示就没有问题,主要是避免在ONEXIT事件里弹出窗口.

#15


嗯,看来只能放弃模式窗口了。
留待以后研究。

还发现一个有趣的情况。这样跳转到Edit2的时候,如果点击右键显示弹出菜单,然后取消,
还是有可能让Edit2恢复到正常状态的。