2008-08-22 47 views
4

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

如果我从其中一个单独的窗体打开模式对话框,主窗体将显示在前面,并显示为窗口任务栏中的选定窗口。假设主要形式是WYSIWYG视图,并且源视图已被删除。您转到源视图中的特定点并插入图像标记。会出现一个对话框,允许您选择并输入图像所需的属性。如果所见即所得视图和源视图重叠,则所见即所得视图将被置于前面并且源视图被隐藏。一旦对话被解散,源视图就会回到视线内。

我试过设置所有者和ParentWindow属性的形式,它是关系到:

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

我怎样才能解决这个问题呢?我还应该尝试什么?

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

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

回答

5

我会使用此代码...(基本上就是拉尔斯说)

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

这有为我解决了一个长期存在的问题。谢谢。 – 2014-07-10 11:08:52

0

首先,我不完全确定我遵循,您可能需要提供一些额外的细节,以帮助我们了解正在发生的事情和问题所在。我想我不确定我是否明白你想要完成什么,以及问题是什么。

其次,您不需要设置对话框的父级,因为这实际上是对Create(传递父级)的调用所发生的情况。你所描述的对话听起来像是可以用一些“重新思考”一点说实话。该对话框是否将源图像的子图像或所见即所得窗口的图像属性输入?

1

显示的对话框是使用ShowModal还是Show?你应该设置你的对话框的PopupMode属性正确。 pmAuto可能是你最好的选择。另请参阅您是否需要设置PopupParent属性。

0

我不知道我很明白你做了什么,但这里的一些事情,我可以建议你可以尝试......不同版本的Delphi之间

  1. 这种行为变化。我建议,这是由于他们跳过来支持Windows 2007在Delphi 2007中的环节。
  2. 如果您使用的是Delphi 2007,请尝试从设置Application.MainFormOnTaskBar布尔变量的项目源文件中删除该行。
  3. 删除后,您应该可以使用各种Form的BringToFront/SendToBack方法来实现您之后的Z顺序。

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

3

我最终最终找到了使用Google网上论坛的answer。简而言之,所有的模式对话框需要具备以下添加到他们:


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

我猜这确实拉尔斯相当于和马吕斯在Delphi 7回答