莫代尔形式之上的主要表格

时间:2012-12-03 11:02:43

标签: c++ window modal-dialog c++builder

我在我面前的C ++ builder 2010项目中有一个奇怪的场景。每隔一段时间模态形式似乎最终落后于主要形式。如果我有主窗口,使用主窗口上的按钮打开辅助窗口,并选择主窗口上将生成模态窗体弹出窗口的按钮,似乎会出现这种情况。模态形式然后在主窗口后面结束,我必须按下escape才能关闭它。

再次打开它会在顶部显示模态窗口,从而产生所需的结果。

有时一旦完成,似乎主窗口开始将自己置于每个窗口的前面。不只是它自己的模态或子窗口,甚至Windows资源管理器窗口和其他程序。 更新:每次模态窗口在主窗口后面结束并使用escape关闭时都会发生这种情况。让主窗口再次正常运行的唯一方法是重新启动应用程序。

我已经检查并摆弄了主窗口和最初问题的模式弹出窗口的 FormStyle PopupMode 属性。但它似乎没有帮助。 主窗口有

FormStyle: fsNormal
PopupMode: pmNone

由于主窗口开始表现得很奇怪,感觉就像主窗口出现问题一样。我特意告诉模态窗口使用主窗口作为并尝试 FormStyle PopupMode 的所有设置和组合而不做任何更改。

为了补充这一点,据报道所有这些都在Vista之前有效(是的,这是一个古老而庞大的应用......呵呵)

更新:主要罪魁祸首似乎是主窗口最终在所有内容之上。这会导致模态形式最终落后于它,看起来像是错误的。这仅在第一次发生时重新打开模态表单将其绘制在主窗口前面。即使主窗口仍然在桌面上的其他所有内容之前。为了增加混淆,当主窗口决定开始这样做时感觉非常随机。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我知道这是一个老问题但我通过将TApplicationEvent添加到Main表单来解决模态焦点问题而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();
    }
}