TEdit焦点&插入符号

时间:2011-09-05 07:58:35

标签: delphi caret setfocus

我有两个TEdit控件。当我退出edit1时, edit2收到焦点。在我的Edit1的OnExit事件上 我有以下代码:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  edit2.Enabled := false;
  edit2.Enabled := true;
  edit2.setfocus;
end;

Edit2具有焦点。但是,它没有任何关注。 我可以开始输入,但是我不知道这令人困惑 哪个控件有焦点。

我对翻转的内容更感兴趣 启用了导致某些消息不属于的属性 射击得当吗?例如edit2的OnEnter事件 没有被触发。

如果重要的话,这是在D2006上。

感谢您的回复。

4 个答案:

答案 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;