windows - Delphi - 如何防止 Forms/MsgBoxes 在先前的表单下移动?

标签 windows delphi dialog z-order delphi-6

在 Windows 98 时代之后,我们多次遇到一些对话框失去其 Z 顺序并返回到以前的形式。

例如:

Dialog1.ShowModal;

Dialog1.OnClickButton() : ShowMessage('anything');

出现MessageBox时,有时没有焦点,移到Dialog1下。 用户对此感到困惑,他们说:我的应用程序卡住了!!! 但是,如果他们使用 Alt+Tab 移动到另一个应用程序并返回,焦点将返回到 MessageBox,它将成为前景窗口。

我们在 ShowMessage、MessageBox、普通表单和 QuickReport 表单中遇到过这种情况。

有人知道吗?它是 Windows 错误吗?你怎么能阻止它?如何捕获这个?

感谢您的帮助: dd


我确实是在 Win98 之后说的,所以所有操作系统(也包括 Win7)都受此问题影响。 我们使用的是 Delphi 6 Prof,因此属性不适用于默认表单。

有人说消息对话框可以用 MessageBox + MB_APPLMODAL 控制。 这是个好消息,但我们有许多旧的表单和组件、第三方工具。

因此,通过替换表单来制作一个全新的应用程序是一项艰巨的工作。

但我们会尝试这样做。

我认为答案是这一半是应用程序问题,一半是 Windows 问题。如果 Windows 有时处理此问题,有时不处理 - 这似乎是 Windows 错误。 但是,如果我们可以强制生成良好的模态窗口,那么它就是一个编程错误。

有人可以向我解释 WS_POPUP 标志的含义吗? 有没有副作用?

感谢: dd

最佳答案

这就是 PopupMode and PopupParent properties 的内容是为了。

例如,您可以:

Dialog1.PopupMode := pmExplicit;
Dialog1.PopupParent := self;
Dialog1.ShowModal;

这会告诉 Windows 正确的 Z 顺序。

关于windows - Delphi - 如何防止 Forms/MsgBoxes 在先前的表单下移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2997079/

相关文章:

delphi - 销毁 Thread 对象的正确方法

delphi - 如何以编程方式更改 TWebBrowser 中的字体

java - 带预览的自定义对话框

android - 将样式应用于所有对话框(微调对话框、警报对话框等)

windows - OpenProcess:仅在 Windows 8.1 上出现拒绝访问错误

windows - 从 WMI ExecQuery 获取第一条记录

linux - 限制硬盘驱动器访问

windows - 在 Windows 10 中自动运行 USB?

德尔福5 : How to suspend anchor layouts?

android - 如何在我的 Android 自定义应用程序类中显示对话框 fragment ?