模态形式之上的主形式

Main Form on top of modal forms

本文关键字:模态      更新时间:2023-10-16

在我面前的C++builder 2010项目中,我遇到了一个奇怪的场景。每隔一段时间,模态表单似乎都会出现在主表单后面。如果我有主窗口,使用主窗口上的按钮打开一个辅助窗口,然后选择主窗口上会产生模态表单弹出窗口的按钮,就会出现这种情况。模态表单最后出现在主窗口后面,我必须按下escape来关闭它

再次打开它会产生所需的结果,模态窗口位于顶部。

有时,一旦完成了这项工作,主窗口似乎开始将自己放在每个窗口的前面。不仅是它自己的模态或子窗口,甚至是windows资源管理器窗口和其他程序Update:每当模式窗口出现在主窗口后面并使用escape关闭时,就会发生这种情况。让主窗口恢复正常运行的唯一方法是重新启动应用程序

我检查并篡改了主窗口和模式弹出窗口的FormStylePopupMode属性,这是最初的问题。但这似乎没有帮助。主窗口有

FormStyle: fsNormal
PopupMode: pmNone

由于主窗口开始表现得很奇怪,感觉好像问题出在主窗口上。我试着特别告诉模式窗口使用主窗口作为其父窗口,并尝试FormStylePopupMode的所有设置和组合,但没有任何更改。

除此之外,据报道,所有这些都在Vista之前工作过(是的,这是一个旧的大型应用程序…呵呵)

更新:罪魁祸首似乎是最终位于所有内容之上的主窗口。这导致模态形式最终落在它后面,看起来好像有什么问题。这种情况只发生在第一次,重新打开模态窗体会将其绘制在主窗口的前面。即使主窗口仍然位于桌面上的所有其他窗口之前。更令人困惑的是,当主窗口决定开始这样做时,感觉非常随机。

这个问题是已知问题的组合,模态形式最终落后于其他形式。谷歌"delphi modal form hidden behind other form"或类似的东西,你会发现很多信息。

另一个促成因素是,已经对申请进行了抵消这些问题的实施。这一点,加上Windows和VCL本身的变化,并没有很好地发挥作用。因此,我去掉了所有"现在"不必要的垃圾,并重写了应用程序如何处理窗口,问题得到了解决。

我知道这是一个老问题,但我通过将TApplicationEvent添加到主窗体和OnActivate来绕过模式焦点问题,检查Screen->ActiveForm是否打开了fsModal,并将其放在前面:

void __fastcall TMainForm::ApplicationEvents1Activate(TObject *Sender)
{
if (Screen->ActiveForm!=NULL)
{
TForm *frm=  Screen->ActiveForm;
if (frm->FormState.Contains(fsModal))
frm->BringToFront();
}
}