Delphi fsStayOnTop奇怪问题

4
这里是问题。主窗体设置为fsNormal。这个主窗体是全屏最大化的,带有一个浮动工具栏。工具栏是普通窗体,样式设置为fsStayOnTop
大多数情况下,这可以正常工作。主窗体显示,工具栏浮动在其上方。
有时(很难找到可重现的步骤),当从其他应用程序alt-tab切换到和从Delphi应用程序(或单击任务栏上的Delphi应用程序图标)时,可能会出现以下症状:
  1. 当从Delphi应用程序alt-tab切换时,浮动的顶部fsStayOnTop窗体仍然停留在其他应用程序的上方。因此,如果我alt-tab到Firefox,那么浮动菜单也会停留在Firefox的上方。

  2. 当从另一个应用程序alt-tab切换到Delphi应用程序时,浮动菜单不可见(因为它位于fsNormal主窗体后面)。

这是已知的bug还是有任何强制其工作的技巧?这似乎在运行多个应用程序副本时发生得最多(它们之间没有交互,并且应该在自己的窗口“沙盒”中运行)。
好像Delphi混淆了哪个窗口应该在顶部并交换它们或将浮动窗体更改为stayontopofeverything模式。
还是我误解了fsStayOnTop?我假设将窗体样式设置为fsStayOnTop会使其保持在当前应用程序中所有其他窗体的上方,而不是跨其他正在运行的应用程序的所有窗口。
3个回答

0
一些更多的信息和可能的解决方法。
将floatingform设置为fsnormal。
当mainform.activate事件触发时,调用floatingform.bringtofront。
但是我也使用stayontop来处理所有其他应用程序对话框。 当多个应用程序的副本正在运行时,对话框会显示同样的问题(例如,如果app1打开了一个对话框并且被alt-tab离开,则对话框可能仍然在所有其他程序之上)。

还有一个问题。我怎样才能将窗体样式设置为仅置于另一个窗体(在这种情况下是主窗体)之上?然后,我可以将对话框更改为不 fsstayontop,并在它们激活时告诉它们只置于主窗体之上?PS,很抱歉自己回答了问题。我没有意识到应该评论而不是回答。 - TallGuy
3
是的,您应该将这整个信息编辑到您的问题中。 - PA.

0

我不知道这个区域是否存在错误。

首先让我解释一下该过程的工作原理:

Delphi首先在窗口创建时使用fsStayOnTop样式,通过调用Win32函数SetWindowPos并将参数设置为HWND_TOPMOST来保持窗口顶部。

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

每当应用程序被停用或最小化时,Delphi会枚举所有顶层表格以标准化表格("normalize"是vcl用于表示不再处于顶层的窗口的术语),并保留所有此时处于顶层的窗口的内部列表。

每次应用程序被激活或还原时,Delphi使用存储在顶层窗口列表中的信息来恢复所有顶层表格(使用带有HWND_TOPMOST参数的setWindowPos)。

对我来说,问题似乎在 Delphi 在应用程序最小化时枚举窗口时存储信息的方式上。

我会尝试入侵最小化或停用功能,并检查顶部窗口列表(它位于 Application.FTopMostList)是否正确列出。


更多信息。已知存在与我最初从Google搜索中展示的fsstayontop相同的错误。我的解决方法现在是将所有对话框设置为fsnormal。然后在mainform.onactivate下添加此代码 if (floatingmenu<>nil) and (floatingmenu.visible=true) then SetWindowPos(floatingmenu.handle, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);现在这个方法可以按预期工作,并且避免了Delphi处理fsstayontop表单时的任何怪异情况。 - TallGuy

-1

请考虑从引用页面中摘录一些内容来扩展您的答案。有关为什么裸链接不被视为好的答案,请参见如何回答 - Be Brave Be Like Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接