当显示另一个窗口时,Control的OnExit会在新控件上执行mouseup事件

IEl*_*ite 1 delphi delphi-7

我在专家交流中找到了这个问题.

当显示另一个窗口时,Control的OnExit会在新控件上执行mouseup事件

这个问题很容易复制.

在表格上放置3个tedits.在edit1的onexit事件中写一个showmessage('exit')运行程序给edit1焦点使用鼠标给edit3焦点,单击ok给showmessage观察你现在怎么不能在edit3中写任何东西,直到你用鼠标点击某处在表格上!给edit2焦点,然后使用鼠标给edit3焦点观察如何在edit3中键入你想要的东西吧!

到目前为止,我已经确定问题在于当旧控件onExit事件显示任何类型的窗口时,edit3没有收到mouseup消息,我也尝试过显示我自己的一个窗体在onExit事件中,结果相同.事实上,在你点击Ok到showmessage之后,windows的印象是鼠标在edit3上被按住了

我想这是Delphi/Windows中的一个错误但是如何解决它?我知道我可以在edit3的onMouseDown事件上强制WM_LBUTTONUP(因为它是在该过程中调用的最后一个事件)但这不仅乏味,而且并不总是适用

我正在尝试做类似的事情:

在onexit事件中,我显示一个警告框,然后想要正常进行 - 将焦点移动到用户实际点击的位置.那可能吗?

Hei*_*cht 6

再一次PostMessage救援!将对话延迟一点,以便Windows可以完成焦点更改.发布消息而不是直接显示对话框:

const
  WM_SHOWMYDIALOG = WM_APP + 321;

TForm1 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  procedure Edit1Exit(Sender: TObject);
private
  procedure WMSHOWMYDIALOG(var Message: TMessage); message WM_SHOWMYDIALOG;
end;

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

procedure TForm1.WMSHOWMYDIALOG(var Message: TMessage);
begin
  ShowMessage('Nice one');
end;
Run Code Online (Sandbox Code Playgroud)

一切都很好:)