在Delphi XE Update 1中,如果父(主)表单的FormStyle设置为fsStayOnTop,我会看似模态表单的随机行为.
1)使用MainFormOnTaskbar:= False(旧方式),一切都"正常".使用新的MainFormOnTaskbar:= True,当主窗体设置为"保持在最顶层"时,模态窗体隐藏在主窗体后面.在大多数情况下说
modalForm.PopupParent := self;
Run Code Online (Sandbox Code Playgroud)
就在调用modalForm.ShowModal之前似乎有所帮助.但不总是.
2)我所有的模态形式都很简单,没有多余的装饰,定位在MainFormCenter,没有使用表单继承等.然而PopupParent修复仅适用于大约一半,而另一半仍然隐藏在主窗体后面.最奇怪的是,在一种情况下,不相关的代码行的排序会破坏或产生它.请参阅此代码中标记为(1)和(2)的行:
procedure TEchoMainForm.DBMaintenancePrompt( actions : TMaintenanceActions );
var
frm : TDBMaintenanceForm;
begin
frm := TDBMaintenanceForm.Create( self );
try
frm.Actions := actions; // (1)
frm.PopupParent := self; // (2)
frm.ShowModal;
finally
frm.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
按此顺序执行时,模态窗体正确显示在主窗体的顶部.但当我扭转线条时,模态形式隐藏在主线之后.标记为(1)的行设置模态形式的属性,这导致在TRzCheckGroup中未选中的多个复选框被检查,坐在TRzPageControl(来自Raize组件)上.这是上面第(1)行执行时运行的setter方法:
procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions);
var
ma : TMaintenanceAction;
begin
for ma := low( ma ) to high( ma ) do
cgMaintActions.ItemChecked[ ord( ma )] := ( …
Run Code Online (Sandbox Code Playgroud) 我有一个表单(下面示例中的 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)非常混乱,并没有表明它应该这样做.
希望这个"修复"不会引起其他问题.
综述:
请参阅以下Craig和Sertac的有用评论.
================================================== ====
如下面的最小化代码所示,TForm10
设置为fsStayOnTop
.TForm10.btnTryDlgClick
调用dlgOpen1.Execute
,显示的对话框符合预期.但是,当我TForm11.Create(Self).ShowModal
在里面打电话时TForm10.btnTryFormClick
,表格隐藏在TForm10后面.我想知道如何理解这种行为,以及为什么标准的TOpenDialog可以按预期显示?任何评论表示赞赏!
PS:一种解决方法是覆盖TForm11的CreateParams过程,并将Params.wndParent设置为0.但是在我看来,使用此变通方法将破坏窗口层次结构.
procedure TForm11.CreateParams(var Params: TCreateParams); // override;
begin
inherited;
params.wndParent := 0;
end;
Run Code Online (Sandbox Code Playgroud)
PS:Remy在以下相关的SO页面中提到了另一种解决方法: setting the modal Form's PopupParent property to be the StayOnTop Form
.但在随后的评论中,Sertac提到这种解决方法也会破坏窗口层次结构.
PS:可能相关的SO页面:
fsStayOnTop形式隐藏的模态形式
如何让FindDialog保持最佳状态(Delphi)?
如何确保对话框始终位于主窗口的前面
当调用ShowModal时,Form隐藏在其他窗体后面
使2个窗体能够相互重叠?
多形式Delphi应用程序和对话框
新创建的模态窗口在Windows Vista
Delphi中失去焦点并变得无法使用 - 如何防止Forms/MsgBox在先前的形式下移动?
如何在主窗体后面使用Delphi辅助表单
使用Show的Fake模式对话框?
Delphi MainFormOnTaskBar模态窗口错误
第10单元的来源:
unit Unit10;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm10 = class(TForm) …
Run Code Online (Sandbox Code Playgroud) 我最近一直在学习 python,现在我想(尝试)创建我的第一个真正的应用程序,一个适用于 Linux 的字幕播放器。到目前为止,我一直在使用 Greenfish 字幕播放器,它是针对 Windows 用户的,在 Linux 中不能正常工作。
我想在 qt 中创建应用程序,因为我发现在 tkinter 中无法使用透明窗口,但是如果有人知道更好的框架,请提出建议!
现在在开始之前,我已经研究了几个小时的网络,以发现如何让我的应用程序显示在全屏 Flash 视频上,这似乎是不可能的。然而,前面提到的 GF 字幕播放器在 Windows 中设法这样做,但在 Linux 中却没有(也许也是因为它通过 wine 运行)。
所以我的问题是有没有可能创建一个透明的应用程序,保留在全屏 Flash 视频上,如果是这样,你能指出我正确的方向吗?
提前致谢。
编辑:这里有一些我一直在尝试的示例代码。这段代码产生的窗口不会停留在全屏视频之上
import sys
from PyQt4 import QtGui, QtCore
class mymainwindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)
app = QtGui.QApplication(sys.argv)
mywindow = mymainwindow()
mywindow.show()
app.exec_()
mywindow.show()
Run Code Online (Sandbox Code Playgroud) 我想创建一个应用程序,用户将决定主窗口将始终位于其他应用程序之上.
在PyQt4中,很容易创建一个始终位于顶部的窗口.这里包括:PyQt:始终在最前面
我希望有一个小部件(菜单项,复选框等),可以打开或关闭此行为.到目前为止,我还没有找到重置原始行为的方法.
谢谢
更新在İsmail'cartman'Dönmez的建议之后,我搜索了一下,我在PyQt4中找到了WindowFlags示例的实现.
它可以在这里找到
我有一个窗口应该保持在Power point幻灯片放映之上.所以它应该在所有窗口之上.我使用VB"user32"轻松地使用VB 6,但它似乎与VB.net不同.
Me.TopMost = True
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,因为它只在程序中工作.
Private Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd As Long) As Long
Private Sub frmTmr_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
BringWindowToTop(Me.Handle)
End Sub
Run Code Online (Sandbox Code Playgroud)
这也会出错!任何帮助是极大的赞赏!提前致谢,
问候
曼居拉
我的程序正在执行一项耗时的任务,我想在应用程序窗口中间显示一个TImage,但它不会保持在最顶层 - 我的VST始终位于顶部.但是,当我使用TPanel时,它会保持在顶部?如何让我的TImage做到这一点?
事实上,适用于所有控件的解决方案将是出色的:)
谢谢!