我有两个TEdit控件。当我退出edit1时, edit2收到焦点。在我的Edit1的OnExit事件上 我有以下代码:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
edit2.Enabled := false;
edit2.Enabled := true;
edit2.setfocus;
end;
Edit2具有焦点。但是,它没有任何关注。 我可以开始输入,但是我不知道这令人困惑 哪个控件有焦点。
我对翻转的内容更感兴趣 启用了导致某些消息不属于的属性 射击得当吗?例如edit2的OnEnter事件 没有被触发。
如果重要的话,这是在D2006上。
感谢您的回复。
答案 0 :(得分:9)
我不明白你禁用和启用edit2
的原因,但是你这样做了:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
edit2.Enabled := false;
edit2.Enabled := true;
edit2.setfocus;
PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0);
end;
顺便说一句,我同意Andreas Rejbrand的观点。
答案 1 :(得分:8)
我严重怀疑你是在做一些糟糕的事情,最好的解决方案很可能是重新设计。您不应该在控件获得焦点时禁用然后启用控件。
答案 2 :(得分:0)
禁用和启用edit2之间有很多代码。
在上一个活动控件的OnExit事件处理程序中有大量代码,不需要禁用下一个活动控件。在下一个活动控件显示插入符之前,该代码将执行,并且能够接收用户输入。只需确保它不会通过启动新线程或使用Application.ProcessMessages
等方式执行执行。
将Screen.Cursor
设置为crHourGlass
,以便向用户明确说明下一个活动控件尚未就绪。
答案 3 :(得分:0)
当OnActive for MainForm激活另一个表单时发现了一个问题。
TMainForm.OnActivate;
begin
ChildForm.ShowModal;
end;
控制焦点已设置但不起作用。我找到的工作是发送PostMessage(Handle,WM_SETFOCUS,0,0);到形式句柄。
procedure TChildForm.FocusControl(AWinControl: TWinControl);
begin
try
// http://stackoverflow.com/questions/7305296/tedit-focus-caret
PostMessage(Handle, WM_SETFOCUS, 0, 0);
PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0);
if AWinControl.CanFocus then
AWinControl.SetFocus;
except
on E: Exception do
begin
Error(Self, E);
end;
end;
end;