【问题标题】:Multiple form Delphi applications and dialogs多表单 Delphi 应用程序和对话框
【发布时间】:2008-08-22 03:51:42
【问题描述】:

我有一个 Delphi 7 应用程序,它有两个文档视图(例如,所见即所得的 HTML 编辑可能有一个所见即所得的视图和一个源视图——不是我真正的应用程序)。它们可以在单独的窗口中打开,也可以停靠在主窗口的选项卡中。

如果我从其中一个单独的窗体打开模式对话框,主窗体会被带到前面,并在 windows 任务栏中显示为选定的窗口。说主要形式是WYSIWYG视图,弹出源视图。您转到源视图中的特定点并插入图像标签。将出现一个对话框,允许您选择并输入图像所需的属性。如果 WYSIWYG 视图和源视图重叠,则 WYSIWYG 视图将被置于前面,源视图被隐藏。一旦对话框被关闭,源视图就会重新出现。

我已尝试将所有者和 ParentWindow 属性设置为与其相关的表单:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

我该如何解决这个问题?我还应该尝试什么?

鉴于人们似乎对我的示例感到困惑,也许我可以尝试一个更好的示例:一个允许您同时打开多个文件的文本编辑器。您打开的文件要么在选项卡中(如在 Delphi IDE 中),要么在它自己的窗口中。假设用户打开拼写检查对话框或查找对话框。发生的情况是,如果文件正在其自己的窗口中编辑,则当显示模式对话框时,该窗口将发送到 z 顺序中的主窗体下方;一旦对话框关闭,它就会返回到原来的 z 顺序。

注意:如果您正在使用 Delphi 7 并正在寻找解决此问题的方法,请在页面下方查看我的答案以了解我最终做了什么。

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    我会使用这段代码...(基本上是 Lars 所说的)

    dialog := TDialogForm.Create( parentForm );
    dialog.PopupParent := parentForm;
    dialog.PopupMode   := pmExplicit; 
    dialog.ShowModal();
    

    【讨论】:

    • 这刚刚为我解决了一个长期存在的问题。谢谢。
    【解决方案2】:

    我最终使用 Google 网上论坛找到了answer。简而言之,所有模态对话框都需要添加以下内容:

    
    procedure TDialogForm.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.Style := Params.Style or WS_POPUP;
      Params.WndParent := (Owner as TWinControl).Handle;
    end;
    

    我猜这相当于 Lars 和 Marius 在 Delphi 7 中的答案。

    【讨论】:

      【解决方案3】:

      对话框是使用 ShowModal 显示还是只显示?您可能应该正确设置对话框的 PopupMode 属性。 pmAuto 可能是您的最佳选择。还要看看是否需要设置 PopupParent 属性。

      【讨论】:

        【解决方案4】:

        首先,我不完全确定我是否遵循,您可能需要提供一些额外的详细信息来帮助我们了解正在发生的事情以及问题所在。我想我不确定我是否完全理解您要完成的工作以及问题所在。

        其次,您不需要设置对话框的父级,因为这本质上是调用 Create(传递父级)时发生的事情。老实说,您所描述的对话听起来像是他们可以使用一些“重新思考”。这个输入图像属性的对话框是源窗口的子窗口,还是所见即所得的窗口?

        【讨论】:

          【解决方案5】:

          我不确定我是否完全理解您的意思,但我可以建议您尝试以下几件事...

          1. 此行为会在不同版本的 Delphi 之间发生变化。我认为这是因为他们在 Delphi 2007 中为支持 Windows Vista 所付出的努力。
          2. 如果您使用的是 Delphi 2007,请尝试从项目源文件中删除设置 Application.MainFormOnTaskBar 布尔变量的行。
          3. 删除后,您应该能够使用各种 Form 的 BringToFront / SendToBack 方法来实现您所追求的 Z 排序。

          我怀疑你的发现已经在this link 上讨论过 当然,我可能完全错过了你的观点,所以提前道歉!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-15
            • 1970-01-01
            相关资源
            最近更新 更多