Delphi 如何确保对话框始终位于主窗口的前面

Delphi 如何确保对话框始终位于主窗口的前面,delphi,dialog,delphi-2007,nonblocking,Delphi,Dialog,Delphi 2007,Nonblocking,我还没有找到最好的解决办法。我有一个非模态对话框,可以通过应用程序中的热键在无限实例中打开。甚至对话框本身也可以打开一个新实例。我希望这些对话框始终位于主应用程序窗口的前面。我试过几种方法 将FormStyle设置为fsStayOntop。这是可行的,但有一个优点,即对话框将出现在所有窗口甚至其他应用程序的前面。我只希望它在我的主窗口前面 将PopupMode设置为pAuto。除一个对话框打开另一个对话框的情况外,这也适用。如果第一个对话框关闭,则会自动关闭第二个对话框。这是不能接受的 使用窗

我还没有找到最好的解决办法。我有一个非模态对话框,可以通过应用程序中的热键在无限实例中打开。甚至对话框本身也可以打开一个新实例。我希望这些对话框始终位于主应用程序窗口的前面。我试过几种方法

  • 将FormStyle设置为fsStayOntop。这是可行的,但有一个优点,即对话框将出现在所有窗口甚至其他应用程序的前面。我只希望它在我的主窗口前面
  • 将PopupMode设置为pAuto。除一个对话框打开另一个对话框的情况外,这也适用。如果第一个对话框关闭,则会自动关闭第二个对话框。这是不能接受的
  • 使用窗体的默认属性。单击主窗口后,打开的对话框就位于主窗口后面

任何其他建议:-)

您可以尝试观看OnHide事件,并立即将可视标志设置为TRUE。但这可能会导致闪烁。

来自

如果PopupMode属性设置为 pmExplicit和poupparent为零, 那么Application.main表单是 隐式地用作POUPPARENT


.AFAIK Delphi 2007支持MainFormOnTaskbar功能。与

   Application.MainFormOnTaskbar := True;
在project source中,任何申请表(带有默认父窗口)都显示在主窗体的上方


如果不确定主窗体是什么窗体,请转到项目/选项/窗体并设置正确的主窗体。
另一个可能的原因是,您正在从以前的Delphi版本升级项目,因此项目源代码不包含上述代码行-手动添加这一行。

我认为您的第一个努力,fsstayontop,是最好的选择。 在其他应用程序前显示的问题可能无法避免,因为您实际上使用的是Windows功能,而不是Delphi独有的功能

我记得手动设置Z顺序是可能的,但在大多数应用程序中这是乏味到不可能的


如果您的对话框没有大到可以隐藏其他应用程序,则可以移动它,用户仍可以访问其他应用程序,而无需首先与您的对话框交互。看起来还不错。

这是关于可视窗口的z顺序。我可能误解了你,因为据我所知,你想要的行为是默认行为。看,刚才做了一个快速测试,你是对的。无法说明为什么我的应用程序没有这样的表现。可能在主窗口前有一个启动对话框和一个登录对话框。但Sertacs解决方案对我有效。谢谢,快速测试证实它似乎工作正常。我不知道pmExplicit是这样工作的。嗯,我想我试过那个,但我不记得为什么我不喜欢那个。它可能类似于打开的第一个窗口是登录对话框。之后,主窗口将显示并像往常一样使用。但无论如何,这些信息都很好。