相关疑难解决方法(0)

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

我的申请基于模态表格.主窗体用ShowModal打开一个窗体,这个窗体用ShowModal打开另一个窗体,所以我们有叠加的模态窗体.有时会出现一个问题,当我们以新的形式调用ShowModal时,它隐藏在以前的表单之后,而不是显示在顶部.按下alt + tab后,表单返回到顶部,但这不是一个好的解决方案.你遇到了这个问题,你是如何处理的?

编辑:

我使用的是Delphi 7.

delphi delphi-7

25
推荐指数
2
解决办法
3万
查看次数

Delphi - 如何防止Forms/MsgBox在先前的表单下移动?

很多时候,在Windows 98时代之后,我们经历过一些对话框丢失了Z-Order并返回到之前的形式.

例如:

Dialog1.ShowModal;

Dialog1.OnClickButton() : ShowMessage('anything');
Run Code Online (Sandbox Code Playgroud)

当MessageBox出现时,它有时没有焦点,并在Dialog1下移动.用户对此感到困惑,他们说:我的申请冻结了!但是如果他们使用Alt + Tab移动到另一个应用程序并返回,焦点将返回到MessageBox,它将成为前景窗口.

我们通过ShowMessage,MessageBox,普通表单以及QuickReport表单体验过这一点.

有谁知道这个?这是一个Windows bug吗?你怎么能阻止它?怎么抓住这个?

谢谢你的帮助:dd


我真的说过,在Win98之后,所有操作系统(Win7也)都会受到这个问题的影响.我们使用Delphi 6 Prof,因此属性不能使用Default表单.

有人说使用MessageBox + MB_APPLMODAL可以控制消息对话框.这是个好消息,但我们有许多旧的表单和组件,第三方工具.

因此,通过替换表单来创建一个全新的应用程序是一项艰苦的工作.

但我们会尝试这样做.

我认为答案是这是半个应用程序问题和半个Windows问题.如果Windows有时会处理此问题,有时则不会 - 这似乎是一个Windows错误.但是,如果我们可以强制制作良好的模态窗口,那么它就是编程错误.

有人可以向我解释一下WS_POPUP标志的含义是什么?它有副作用吗?

谢谢:dd

windows delphi dialog z-order delphi-6

16
推荐指数
2
解决办法
1万
查看次数

新创建的模式窗口在Windows Vista中失去焦点并变得无法使用

有时当我在我的Delphi应用程序中打开一个模态窗口需要一段时间才能显示,然后我注意到应用程序被阻止了,发生了什么是模式窗体是用ShowModal打开但是没有显示和应用程序被锁定,好像模态窗口在第一层.

通常当发生这种情况时,我必须使用Alt + Tab或Windows + Tab来查找"隐藏"模式窗口,但这并不是每次都有效.

这种行为恰好发生在Vista中,但它非常烦人.

有没有办法防止这种"焦点怪异"发生?

谢谢.

*编辑*

显然设置Application.MainFormOnTaskbar:= True解决了这个问题,但现在推迟得出结论还为时尚早,因为这是随机发生的.

*编辑2*

ModalFormOnTaskbar没有解决问题,之后我尝试设置PopupMode = pmAuto,但这只会让问题变得更糟.

现在我正在尝试显式设置PopupParent,并会告诉您问题是否已解决.

windows delphi windows-vista

10
推荐指数
2
解决办法
6417
查看次数

fsStayOnTop 表单隐藏的模态表单

我有一个表单(下面示例中的 TBigForm),它允许操作一些复杂的数据并需要显示其他信息。我将此信息放入 fsStayOnTop 表单(示例中为 OnTopForm)中,以确保它始终可见,但可以在必要时移开。现在,当 TBigForm 中的某些用户操作显示模式表单时,它通常会隐藏在 OnTopForm 后面,这使得应用程序看起来冻结。我怎样才能避免这种情况?(搜索产生了很多很多的结果,但我无法从中提炼出解决方案。)

在我的真实应用程序中,有很多地方显示模式表单,因此我想避免更改所有这些调用。

示例:创建一个新的 VCL 应用程序,在 Form1 上放置一个 TButton,双击该按钮,并将生成的 Button1Click 实现存根替换为以下内容:

type
  TBigForm = class(TForm)
  strict private
    OnTopForm: TForm;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure DoHide; override;
    procedure DoShow; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

{ TBigForm }

procedure TBigForm.Button1Click(Sender: TObject);
begin
  ShowMessage('Test');
end;

constructor TBigForm.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);

  Caption := 'Big form';
  WindowState := wsMaximized;

  Button1 := TButton.Create(Self);
  Button1.Parent := Self;
  Button1.Caption := 'Freeze!';
  Button1.SetBounds(10, 10, 100, 100); …
Run Code Online (Sandbox Code Playgroud)

delphi modal-dialog stayontop

6
推荐指数
1
解决办法
5105
查看次数

如何让FindDialog保持最佳状态(Delphi)?

在Delphi 2009中,我做了一个简单的事情:

FindDialog.Execute;
Run Code Online (Sandbox Code Playgroud)

FindDialog窗口保持在程序主窗口的顶部.

但是,如果我在我自己的程序窗口中打开来自其他程序的另一个窗口,则FindDialog窗口仍然位于另一个窗口的顶部.

如果我尝试使用其他程序(例如记事本)的FindDialog,则不会发生这种情况.在记事本和其FindDialog上打开另一个程序的窗口将覆盖Notepad和FindDialog窗口.这似乎是正确和预期的行为.

这是我做错了还是Delphi实现FindDialog的问题?有什么我可以做到使记事本的方式工作?


谢谢大家的评论.您无法重现我的问题的事实已经是一个线索,它是导致这种情况的其他原因.这将有助于我追踪它.当我发现一些东西时,我会再研究一下并发布更多信息.


很有意思.我的PrintDialog不会保持最佳状态.仍然不知道为什么我的FindDialog会这样做.还在研究......


我将调用更改为:FindDialog.Execute(Handle); 还是排在最前面.


我在我的主窗体中添加了另一个FindDialog(这次是FindDialog1),并在程序启动时执行它.它具有相同的保持最佳行为.这至少表明它与我的FindDialog或我用它做的自定义没有任何关系.所以它必须是我主要形式的设置.


看起来我不是唯一一个遇到过这种情况的人.请参阅:资源调优器:版本历史似乎是一个Delphi应用程序,在版本1.99下它指出:"修正:切换到另一个应用程序时,(搜索)对话框预览窗口保持在顶部." 我可能会尝试联系他们,看看他们是否记得他们的修复方法.


我在表单中添加了一些新的对话框,并将这些调用放在一个地方:

FindDialog1.Execute();
PrintDialog1.Execute();
ReplaceDialog1.Execute();
FontDialog1.Execute();
Run Code Online (Sandbox Code Playgroud)

FindDialog和ReplaceDialog保持在其他窗口的顶部.PrintDialog和FontDialog不会保持最佳状态并且可以正常工作.

那么两组对话框之间的区别是什么让前两个对话框出错?


此外,这个问题发生在我的程序的旧版本,使用Delphi 4编译.哎呀.现在我发现在我使用Delphi 4的旧版本中没有发生这个问题.

并且是用户报告了这个问题.他使用Windows XP,我正在开发Vista,所以它发生在不同的操作系统下.


确认:是的,我创建了一个新表单并在其上添加了FindDialog.FindDialog没有问题.这表明我的程序中的某些东西导致FindDialog保持在最顶层.现在,我必须找出那是什么.还有什么想法吗?如果有人给我一个答案,甚至给我一个帮助我解决这个问题的线索,那么他们将得到接受的答案.


解决方案:Sertac对他的回答的编辑给了我解决方法:

  Application.NormalizeTopMosts;
  FindDialog.Execute();
  Application.RestoreTopMosts;
Run Code Online (Sandbox Code Playgroud)

这样做可以防止FindDialog在应用程序不是TopMost时成为TopMost.

...但我仍然真的不理解这一点(Delphi帮助NormalizeTopMosts)非常混乱,并没有表明它应该这样做.

希望这个"修复"不会引起其他问题.

delphi dialog stayontop

6
推荐指数
1
解决办法
2708
查看次数

如何允许Delphi辅助表单位于主表单后面

如果在Delphi 2010或XE中将Application.MainFormOnTaskbar设置为true,则所有辅助表单始终位于主窗口的前面。将Popupmode或PopupParent属性设置为什么都没有关系。但是,我有一些辅助窗口,希望可以在主窗体后面显示。

如果将MainFormOnTaskbar设置为false,则可以使用,但是Windows 7功能会损坏(Alt-tab,Windows栏图标等)。

我如何在保持Windows 7功能正常运行的同时仍允许辅助窗体隐藏在主窗体后面?

forms delphi delphi-2010 delphi-xe

5
推荐指数
1
解决办法
2136
查看次数

使两种形式能够相互重叠?

我希望有一个单独的表单,与我的主表单"沿"显示,因此它不会与主表单重叠.

这是一个例子: 例

注意主程序如何重叠日志?我无法弄清楚如何在Delphi中做到这一点.

谢谢!

forms delphi vcl tform

5
推荐指数
1
解决办法
1322
查看次数

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

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

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

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

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

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

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

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

delphi delphi-7

4
推荐指数
1
解决办法
7170
查看次数

如何确保对话框始终位于主窗口的前面

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

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

任何其他建议:-)

delphi dialog nonblocking delphi-2007

3
推荐指数
1
解决办法
2144
查看次数

Delphi MainFormOnTaskBar模态窗口错误

您好

我正在使用Delphi 2007并将MainFormOnTaskBar属性设置为true.

我遇到的问题是这个.

如果从主窗体中打开子窗口,然后从刚刚打开的子窗口显示一个消息对话框.当您关闭消息对话框然后关闭子窗口时,主窗体将发送到您在屏幕上的任何其他应用程序的后面.

这种情况发生在Windows Vista和Windows 7下.有谁知道为什么会发生这种情况,我该如何解决?

delphi modal-dialog delphi-2007 windows-vista

1
推荐指数
1
解决办法
1864
查看次数