【发布时间】:2016-03-17 15:55:08
【问题描述】:
我开始遇到关闭模式表单时主表单消失在其他应用程序窗口后面的问题,我希望有人以前会遇到(并解决!)这个问题,或者有关于在哪里定位断点进行调试的建议问题。
我的问题最初始于经典的“害羞对话框”问题,模态对话框出现在间歇性出现的主窗体下。为了尝试对此进行排序,我将所有模态表单的 popupmode 更改为 pmAuto 并添加了
Application.ModalPopupMode := pmAuto;
和Application.MainFormOnTaskBar := true; 到我的应用程序dpr。
现在我在关闭模式弹出窗口时让主窗体消失在其他窗口后面。我怀疑该行为主要是在模式表单打开第二个窗口时引起的(MessageDlg 和直接Form.create(Application); Form.show; 都有问题),尽管显示/免费代码没有明显问题(ShowModal表单创建所有者 = nil,无模式,所有者 = 应用程序)。在这两种情况下,表单都会在关闭第一个原始模式表单时消失,但在不触发新表单/对话框出现的情况下操作模式表单似乎可以按预期工作。
在主窗体的后台还有其他令人讨厌的事情发生,刷新计时器激活了后台线程,但通常在看到它不起作用的时间内这并没有触发。除此之外,我们还通过第三方 DLL 触发对远程服务器的调用(该应用程序实际上是一个客户端 GUI)。
令人讨厌的是,我无法获得一个小程序来模拟该行为,并且在 IDE 中运行使查看该行为变得困难,因为 IDE 本身包含许多混淆 Z 顺序的窗口。
编辑 - 在下面写下我的答案后,我似乎收到了一个发送到应用程序的停用事件(我可以通过 Application.OnDeactivate 捕获它) - 它似乎类似于WPF App loses completely focus on window close Delphi 没有激活方法c# 解决方案有,但我会玩一些 Windows 消息传递,看看我是否能到达任何地方
【问题讨论】:
-
你需要做一些调试。您说 IDE 使事情变得混乱。这是正常的。但并非所有调试都应在 IDE 中完成。事实上,对于这种调试,IDE 通常是无用的。使用跟踪调试。记录。您需要记录的是每个顶级窗口的所有者。我不是指
TComponent属性Owner。意思是 Win32 窗口所有者。通过调用GetWindow传递GW_OWNER找出它是什么。使用一些记录工具记录它。 OutputDebugString 就足够了。然后你会看到所有权结构被打破了。那么你需要找出原因。 -
你会想要熟悉这个:msdn.microsoft.com/en-us/library/windows/desktop/ms632599.aspx,特别是这个一个拥有的窗口在 z 顺序中总是在它的所有者之上。 主窗体的窗口通常应位于所有权链的顶端。您的主窗体窗口显然不是。您需要找出原因。
-
您的症状是您的非模态窗口没有及时启用。我不是说是这样,但要检查是一回事。无法激活禁用的窗口,因此如果在模式对话框关闭时未启用调用表单,则窗口管理器会自行选择另一个窗口。
标签: delphi delphi-xe2