我的申请基于模态表格.主窗体用ShowModal打开一个窗体,这个窗体用ShowModal打开另一个窗体,所以我们有叠加的模态窗体.有时会出现一个问题,当我们以新的形式调用ShowModal时,它隐藏在以前的表单之后,而不是显示在顶部.按下alt + tab后,表单返回到顶部,但这不是一个好的解决方案.你遇到了这个问题,你是如何处理的?
编辑:
我使用的是Delphi 7.
很多时候,在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
有时当我在我的Delphi应用程序中打开一个模态窗口需要一段时间才能显示,然后我注意到应用程序被阻止了,发生了什么是模式窗体是用ShowModal打开但是没有显示和应用程序被锁定,好像模态窗口在第一层.
通常当发生这种情况时,我必须使用Alt + Tab或Windows + Tab来查找"隐藏"模式窗口,但这并不是每次都有效.
这种行为恰好发生在Vista中,但它非常烦人.
有没有办法防止这种"焦点怪异"发生?
谢谢.
*编辑*
显然设置Application.MainFormOnTaskbar:= True解决了这个问题,但现在推迟得出结论还为时尚早,因为这是随机发生的.
*编辑2*
ModalFormOnTaskbar没有解决问题,之后我尝试设置PopupMode = pmAuto,但这只会让问题变得更糟.
现在我正在尝试显式设置PopupParent,并会告诉您问题是否已解决.
我有一个表单(下面示例中的 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 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 2010或XE中将Application.MainFormOnTaskbar设置为true,则所有辅助表单始终位于主窗口的前面。将Popupmode或PopupParent属性设置为什么都没有关系。但是,我有一些辅助窗口,希望可以在主窗体后面显示。
如果将MainFormOnTaskbar设置为false,则可以使用,但是Windows 7功能会损坏(Alt-tab,Windows栏图标等)。
我如何在保持Windows 7功能正常运行的同时仍允许辅助窗体隐藏在主窗体后面?
我希望有一个单独的表单,与我的主表单"沿"显示,因此它不会与主表单重叠.
这是一个例子: 
注意主程序如何重叠日志?我无法弄清楚如何在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 2007并将MainFormOnTaskBar属性设置为true.
我遇到的问题是这个.
如果从主窗体中打开子窗口,然后从刚刚打开的子窗口显示一个消息对话框.当您关闭消息对话框然后关闭子窗口时,主窗体将发送到您在屏幕上的任何其他应用程序的后面.
这种情况发生在Windows Vista和Windows 7下.有谁知道为什么会发生这种情况,我该如何解决?
delphi ×10
dialog ×3
delphi-2007 ×2
delphi-7 ×2
forms ×2
modal-dialog ×2
stayontop ×2
windows ×2
delphi-2010 ×1
delphi-6 ×1
delphi-xe ×1
nonblocking ×1
tform ×1
vcl ×1
z-order ×1