加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:10:41 所属栏目:大数据 来源:网络整理
导读:我在 Experts-Exchange找到了这个问题. Control’s OnExit eats up mouseup event for new control when showing another window The problem can be replicated easily. place 3 tedits on a form. write a showmessage(‘exit’) in edit1’s onexit event
我在 Experts-Exchange找到了这个问题.

Control’s OnExit eats up mouseup event for new control when showing
another window

The problem can be replicated easily.

place 3 tedits on a form. write a showmessage(‘exit’) in edit1’s
onexit event run the program give edit1 focus use the mouse to give
edit3 focus,click ok to the showmessage observe how you can’t write
anything in edit3 now,until you click with the mouse somewhere on the
form ! give edit2 focus,then use to the mouse to give edit3 focus
observe how you can type what you want in edit3 now !

So far I’ve established that the problem lies in the fact that edit3
doesn’t receive a mouseup-message when the old controls onExit event
displays a window of any kind,i’ve tried it as well with showing a
form of my own in the onExit event,same result. In fact,windows is
under the impression that the mouse is held down over edit3 after
you’ve clicked Ok to the showmessage

I guess it’s a bug in Delphi/Windows but how to work around it ? I
know i can force a WM_LBUTTONUP on edit3’s onMouseDown event (since
its the last event called in the process) but that’s more than
tedious,and not always applicable

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

在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);
end;

procedure TForm1.WMSHOWMYDIALOG(var Message: TMessage);
begin
  ShowMessage('Nice one');
end;

一切都很好:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读