6

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

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

Edit2 具有焦点。但是,其中没有插入符号。我可以开始输入,但它很混乱,因为我不知道哪个控件具有焦点。

我对导致某些消息无法正确触发的 Enabled 属性的翻转更感兴趣?例如 edit2 的 OnEnter 事件没有被触发。

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

谢谢回复。

4

4 回答 4

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 的观点。

于 2011-09-05T08:11:33.480 回答
9

我严重怀疑你的做法很糟糕,最好的解决方案很可能是重新设计。您不应该在接收焦点时禁用然后启用控件。

于 2011-09-05T08:21:13.753 回答
0

在禁用和启用edit2之间有一堆代码。

在前一个活动控件的 OnExit 事件处理程序中有大量代码不需要禁用下一个活动控件。该代码在下一个活动控件显示插入符号之前执行,并且能够接收用户输入。只需确保它不会通过启动新线程或使用Application.ProcessMessages.

设置Screen.CursorcrHourGlass让用户清楚地知道下一个活动控件尚未准备好。

于 2011-09-05T21:35:10.760 回答
0

当 MainForm 的 OnActive 激活另一个表单时发现问题。

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;
于 2016-10-12T16:35:19.727 回答