【问题标题】:How to make sure a dialog is always front of the main window如何确保对话框始终位于主窗口的前面
【发布时间】:2010-08-23 15:36:35
【问题描述】:

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

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

任何其他建议:-)

【问题讨论】:

  • 我可能误解了你,因为据我所知,你想要的行为是默认行为。见privat.rejbrand.se/zorder.exe
  • 刚刚对此进行了快速测试,您是对的。不能说为什么我的应用程序不这样。可能是在主窗口之前有一个 Splash 和一个登录对话框。但是 Sertacs 解决方案对我有用。

标签: delphi dialog delphi-2007 nonblocking


【解决方案1】:

来自TCustomForm.PopupParent Property

如果 PopupMode 属性设置为 pmExplicit 和 PopupParent 为零, 那么 Application.MainForm 是 隐式用作 PopupParent

.

【讨论】:

  • 谢谢,快速测试确认它似乎工作正常。我不知道 pmExplicit 是这样工作的。
【解决方案2】:

AFAIK Delphi 2007 支持 MainFormOnTaskbar 功能。与

   Application.MainFormOnTaskbar := True;

在项目源中任何应用程序表单(带有默认父窗口)都显示在主表单上方。


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

【讨论】:

  • 嗯,我想我试过那个,但我不记得我为什么不喜欢那个。它可能类似于打开的第一个窗口是登录对话框。之后显示主窗口并照常使用。但无论如何,这些信息都很好。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这是关于可见窗口的 z 顺序。
    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多