我在我面前的C ++ builder 2010项目中有一个奇怪的场景。每隔一段时间模态形式似乎最终落后于主要形式。如果我有主窗口,使用主窗口上的按钮打开辅助窗口,并选择主窗口上将生成模态窗体弹出窗口的按钮,似乎会出现这种情况。模态形式然后在主窗口后面结束,我必须按下escape才能关闭它。
再次打开它会在顶部显示模态窗口,从而产生所需的结果。
有时一旦完成,似乎主窗口开始将自己置于每个窗口的前面。不只是它自己的模态或子窗口,甚至Windows资源管理器窗口和其他程序。 更新:每次模态窗口在主窗口后面结束并使用escape关闭时都会发生这种情况。让主窗口再次正常运行的唯一方法是重新启动应用程序。
我已经检查并摆弄了主窗口和最初问题的模式弹出窗口的 FormStyle 和 PopupMode 属性。但它似乎没有帮助。 主窗口有
FormStyle: fsNormal
PopupMode: pmNone
由于主窗口开始表现得很奇怪,感觉就像主窗口出现问题一样。我特意告诉模态窗口使用主窗口作为父并尝试 FormStyle 和 PopupMode 的所有设置和组合而不做任何更改。
为了补充这一点,据报道所有这些都在Vista之前有效(是的,这是一个古老而庞大的应用......呵呵)
更新:主要罪魁祸首似乎是主窗口最终在所有内容之上。这会导致模态形式最终落后于它,看起来像是错误的。这仅在第一次发生时重新打开模态表单将其绘制在主窗口前面。即使主窗口仍然在桌面上的其他所有内容之前。为了增加混淆,当主窗口决定开始这样做时感觉非常随机。
答案 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();
}
}