Delphi fsStayOnTop奇怪

时间:2010-03-17 08:19:00

标签: delphi stayontop

这是合约。主窗体设置为fsNormal。这个主窗体最大化全屏,带有浮动工具栏。工具栏是普通表单,其样式设置为fsStayOnTop

大部分时间都按预期工作。主窗体显示,工具栏浮在它上面。

当与其他应用程序进行alt-tabbing时(或者单击任务栏上的Delphi应用程序图标时),有时(这是找到一组可重现步骤的错误),可能会出现以下症状:

  1. 当远离Delphi应用程序进行alt-tabbing时,浮动的最顶层fsStayOnTop表单会保留在其他应用程序之上。因此,如果我对Firefox进行alt-tab,那么浮动菜单也会保留在Firefox之上。

  2. 当从另一个应用程序进行alt-tabbing到Delphi应用程序时,浮动菜单不可见(因为它位于fsNormal主要形式的后面)。

  3. 这是一个已知的错误还是有任何黑客强迫它工作?当应用程序的多个副本正在运行时,它似乎也会发生这种情况(它们之间没有任何交互,应该在自己的窗口“sandbox”中运行)。

    就好像Delphi会混淆哪个窗口位于顶部并交换它们或更改浮动窗体以保持其他任何模式。

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

3 个答案:

答案 0 :(得分:0)

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

将浮动形式设置为fsnormal。

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

但我也使用stayontop来处理所有其他应用程序对话框。当应用程序的多个副本运行时,对话框显示相同的问题(即,如果app1打开一个对话框,并且远离对话框的alt-tabbed可能会保持在所有其他程序之上)。

答案 1 :(得分:0)

我不知道这方面的错误。

首先让我解释一下这个过程是如何运作的:

Delphi首先在创建保存表单的窗口期间使用fsStayOnTop样式,方法是使用SetWindowPos参数调用win32函数HWND_TOPMOST

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

每次停用或最小化应用程序时,Delphi都会枚举所有最顶层的表单来规范化表单(规范化是vcl用来表示最顶层的窗口不是最顶层的术语)并保留内部列表当时最重要的所有窗户。

每次激活或恢复应用程序时,Delphi都会使用存储在最顶层窗口列表中的信息来恢复所有最顶层的表单(使用带有setWindowPos参数的HWND_TOPMOST

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

我会破解最小化或停用功能,并检查最顶层的窗口列表(它位于Application.FTopMostList上)是否正确列出。

答案 2 :(得分:-1)

我遇到了类似问题,此链接对我有很大帮助:Delphi: Balloon Form with fsStayOnTop not working in Win7

当我调用Application.NormalizeTopMosts()函数时,最顶层的表单就像我期望的那样。