Delphi fsStayOnTop奇怪

这是交易。主表格设置为
fsNormal
。这个主窗体最大化全屏,带有浮动工具栏。工具栏是普通形式,样式设置为
fsStayOnTop
。 大部分时间都按预期工作。主窗体显示,工具栏浮动在其上方。 当与其他应用程序进行alt-tabbing时(或者在单击任务栏上的Delphi应用程序图标时),有时(这是找到可重复的步骤集的错误)可能会发生以下症状: 当远离Delphi应用程序进行alt-tabbing时,浮动的最顶层
fsStayOnTop
表单将保持在其他应用程序之上。因此,如果我对Firefox进行alt-tab,那么浮动菜单也会保留在Firefox之上。 当从另一个应用程序进行alt-Tabbing到Delphi应用程序时,浮动菜单不可见(因为它位于
fsNormal
主窗体后面)。 这是一个已知的错误还是有任何黑客强迫它工作?当应用程序的多个副本正在运行时,它们似乎也会发生这种情况(它们之间没有交互,应该在自己的窗口“sandbox”中运行)。 这就好像德尔福混淆了哪个窗口应该在顶部并交换它们或者改变浮动形式以保持所有模式。 或者我误解了
fsStayOnTop
?我假设将表单样式设置为
fsStayOnTop
使其保持在当前应用程序中的所有其他表单之上,而不是所有其他正在运行的应用程序的窗口。     
已邀请:
更多信息和可能的解决方案。 将浮动形式设置为fsnormal。 当mainform.activate事件触发时调用floatingform.bringtofront。 但我也使用stayontop来处理所有其他应用程序对话框。当应用程序的多个副本正在运行时,对话框显示相同的问题(即,如果app1打开一个对话框,并且远离对话框的alt-tabbed可能会保持在所有其他程序之上)。     
我不知道这方面的错误。 我先解释一下这个过程是如何工作的: Delphi首先在创建保存表单的窗口期间使用
fsStayOnTop
样式,通过调用带有
HWND_TOPMOST
参数的win32函数
SetWindowPos
。 有关
SetWindowPos
的详细说明,请参见http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx。 每次取消激活或最小化应用程序时,Delphi都会枚举所有最顶层的表单以规范化表单(规范化是vcl用来表示最顶层的窗口变为不是最顶层的术语)并保留所有表单的内部列表那个时刻最顶层的窗户。 每次激活或恢复应用程序时,Delphi都会使用存储在最顶层窗口列表中的信息来恢复所有最顶层的窗体(使用带有
HWND_TOPMOST
参数的
setWindowPos
) 所以对我来说,问题似乎是Delphi在应用程序最小化时枚举窗口时存储信息的方式。 我会破解最小化或停用功能,并检查最顶层的窗口列表(它是在
Application.FTopMostList
)是否正确列出。     
我有一个类似的问题,这个链接帮了我很多:Delphi:带有fsStayOnTop的气球表格在Win7中不起作用 当我调用Application.NormalizeTopMosts()函数时,最顶层的表单就像我期望的那样。     

要回复问题请先登录注册