多种形式的Delphi应用程序和对话框

时间:2008-08-22 03:51:43

标签: delphi delphi-7

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

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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;

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

首先,我并不完全确定我会遵循,您可能需要提供一些其他详细信息,以帮助我们了解正在发生的事情以及问题所在。我想我不确定我到底知道你要完成什么以及问题是什么。

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

答案 4 :(得分:0)

我不确定我是否完全明白你的目标是什么,但我可以建议你尝试一些事情......

  1. 此行为在不同版本的Delphi之间发生变化。我建议这是因为他们为了支持Delphi 2007中的Windows Vista而跳槽。
  2. 如果您使用的是Delphi 2007,请尝试从项目源文件中删除设置Application.MainFormOnTaskBar布尔变量的行。
  3. 删除后,您应该可以使用各种Form的BringToFront / SendToBack方法来实现您所追求的Z顺序。
  4. 我怀疑你发现的内容已在this link上讨论过 当然,我可能完全错过了你的观点,所以提前道歉!