delphi - 调用 ShowModal 时,表单隐藏在其他表单后面

标签 delphi delphi-7

我的应用程序基于模态表单。主窗体用 ShowModal 打开一个窗体,这个窗体用 ShowModal 打开另一个窗体,所以我们有堆叠的模态窗体。有时会出现一个问题,当我们在新表单中调用ShowModal时,它会隐藏在以前的表单后面,而不是显示在顶部。按 alt+tab 后,表单回到顶部,但这不是一个好的解决方案。您遇到过这个问题吗?您是如何处理的?

编辑:

我使用Delphi 7。

最佳答案

你没有提到Delphi的版本...

较新的 Delphi 版本向 TCustomForm 添加了两个新属性:PopupMode 和 PopupParent。将模式对话框的 PopupParent 设置为创建该对话框的窗体可确保子窗体位于其父窗体之上。它通常可以解决您所描述的问题。

我认为这对属性是在 Delphi 2006 中添加的,但可能是 2005 年。它们肯定存在于 Delphi 2007 及更高版本中。

编辑:在看到您使用Delphi 7后,我唯一的建议是,在显示模态表单的代码中,禁用创建它的表单,并在返回时重新启用。这应该会阻止创建窗口接收输入,这可能有助于保持 Z 顺序正确。

这样的东西可能会起作用(未经测试,因为我不再使用 D7):

procedure TForm1.ShowForm2;
begin
  Self.Enabled := False;
  try
    with TForm2.Create(nil) do
    begin
      try
        if ShowModal = mrOk then
          // Returned OK. Do something;
      finally
        Free;
      end;
    end;
  finally
    Self.Enabled := True;
  end;
end;

如果 Form2 创建模态窗口(正如您所提到的),只需重复该过程 - 禁用 Form2,创建 Form3 并以模态方式显示它,然后在返回时重新启用 Form2。确保使用 try..finally 正如我所展示的,这样如果模式表单中出现问题,创建表单总是会重新启用。

关于delphi - 调用 ShowModal 时,表单隐藏在其他表单后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639125/

相关文章:

windows - 获取 unicode 符号的别名

android - 在Delphi XE7 Android中的Messagedlg

delphi - win32 或 SQL 查询哪个最快?

delphi - Delphi 应用程序如何检测 Windows PC 的网络代理设置?

delphi - Delphi 7 中的 GetStackTrace?

delphi - 使用Delphi递归删除所有文件和文件夹

c# - 在 C# 中调用 Delphi COM 对象抛出 AccessViolationException

delphi - 加载图像和调整图像大小的最快方法是什么?

delphi - RTTI Delphi 创建一个 n 维矩阵作为 TValue

delphi - 为什么加载PNG图像格式图标会导致 "Out of system resources"异常?