德尔福fsStayOnTop奇数

问题描述:

这是交易。主窗体设置为fsNormal。这个主窗体通过浮动工具栏全屏显示。工具栏是标准样式,样式设置为fsStayOnTop德尔福fsStayOnTop奇数

大多数情况下,按预期工作。 mainform显示,工具栏浮在上面。

有时候(这是要找到一个可重复的一系列步骤管不着)时,ALT-Tab键,并从其他应用程序(或单击任务栏上的Delphi应用程序图标时)以下症状可能发生:

  1. 当离开Delphi应用程序时,浮动的最上面的fsStayOnTop窗体停留在其他应用程序之上。因此,如果我使用Firefox的话,浮动菜单也会保持在Firefox的顶部。

  2. 当从另一个应用程序的Alt键切换到Delphi应用程序时,浮动菜单不可见(因为它位于fsNormal mainform的后面)。

这是一个已知的错误,还是有任何黑客强迫它的工作?当应用程序的多个副本正在运行时(这些应用程序之间没有交互,并且应该在自己的Windows“沙箱”中运行),这也似乎发生的最多。

就好像德尔福弄糊涂了哪个窗口意味着置顶,并将它们互换或将浮动窗体更改为静态模式。

还是我误解了fsStayOnTop?我假设将表单样式设置为fsStayOnTop可以使其保持在当前应用程序中的所有其他表单之上,而不是其他所有窗体在其他正在运行的应用程序中。

更多信息和可能的解决方案。

将floatform设置为fsnormal。

当mainform.activate事件触发时调用floatingform.bringtofront。

但我也使用stayontop所有其他应用程序对话框。当应用程序的多个副本正在运行时,对话框显示相同的问题(即,如果app1的对话框处于打开状态并且离开对话框的对话框可能会保留在所有其他程序的顶部)。

+0

还有一个问题。我怎样才能设置一个窗体样式,以保持只有另一种形式(在这种情况下,主窗体)?然后我可以改变对话框而不是fsstayontop,当他们激活时,我可以告诉他们只留在主表顶部? PS,很抱歉回答我自己的问题。我没有意识到我应该评论而不是回答。 – TallGuy 2010-03-17 09:24:01

+3

是的,你应该移动这整个信息编辑你的问题。 – 2010-03-17 09:45:00

我不知道这方面的错误。

让我先解释这个过程是如何工作的:创建保存的形式,通过调用Win32函数SetWindowPosHWND_TOPMOST参数窗口中

德尔福首先使用fsStayOnTop风格。

有关SetWindowPos的详细说明,请参阅http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx

每次应用程序被停用或最小化时,Delphi枚举所有最顶层的窗体来规范化窗体(normalize是vcl用来表示最顶层的窗口变成不是最顶层的术语)并且它保持内部当时最顶层的所有窗口的列表。

每次应用程序被激活或恢复,Delphi使用存储在最顶层窗口的列表中的信息,以

所以恢复所有最顶层的形式(使用setWindowPosHWND_TOPMOST参数)给我的问题似乎是在Delphi在应用程序最小化时枚举窗口时存储信息的方式。

我会进入最小化或取消激活功能,并检查最上面的窗口列表(它在Application.FTopMostList上)是否被正确列出。

+0

一些更多的信息。有一些与我在谷歌搜索中用fsstayontop显示的内容相同的已知错误。 我的修复程序现在将所有对话框设置为fsnormal。然后在mainform.onactivate下添加这段代码 如果(floatingmenu nil)和; 这可以像现在预期的那样工作,并且可以远离任何delphi怪异处理fsstayontop窗体的方式。 – TallGuy 2010-03-20 23:13:03

我有一个类似的问题,这个环节我有很大帮助:Delphi: Balloon Form with fsStayOnTop not working in Win7

当我打电话Application.NormalizeTopMosts()函数,则最顶层的形式表现如我所料。

+0

考虑用参考页面的摘录扩展您的答案。请参阅[如何回答](http://stackoverflow.com/questions/how-to-answer)了解裸露链接不被视为良好答案的详细信息。 – bytebuster 2012-10-29 00:14:59