我在专家交流中找到了这个问题.
当显示另一个窗口时,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事件中,我显示一个警告框,然后想要正常进行 - 将焦点移动到用户实际点击的位置.那可能吗?
再一次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)
一切都很好:)
| 归档时间: |
|
| 查看次数: |
1790 次 |
| 最近记录: |