3

これが取引です。に設定されたメイン フォームfsNormal。このメイン フォームは、フローティング ツールバーを備えたフルスクリーンで最大化されています。ツールバーは、スタイルが に設定された通常の形式fsStayOnTopです。

ほとんどの場合、これは期待どおりに機能します。メインフォームが表示され、ツールバーがその上に浮かびます。

他のアプリとの間で Alt キーを押しながらタブ移動するとき (またはタスクバーの Delphi アプリ アイコンをクリックするとき) に、次のような症状が発生することがあります (これは、再現可能な一連の手順を見つけるためのバグです)。

  1. Alt キーを押しながら Delphi アプリから離れると、一番上のフローティングfsStayOnTopフォームが他のアプリの上に表示されたままになります。そのため、Firefox に alt-tab キーを押すと、フローティング メニューも Firefox の上に表示されたままになります。

  2. 別のアプリから Delphi アプリに Alt-Tab キーを押しても、フローティング メニューは表示されません(メインフォームの背後にあるfsNormalため)。

これは既知のバグですか、それとも強制的に機能させるハックはありますか? これは、アプリの複数のコピーが実行されている場合にも最も発生するようです (それらの間で相互作用がなく、独自のウィンドウ "サンドボックス" で実行されている必要があります)。

Delphi がどのウィンドウを一番上に置くべきか混乱して、それらを交換したり、フローティング フォームをすべての上にとどまるモードに変更したりします。

それとも誤解していfsStayOnTopますか?フォーム スタイルを設定してfsStayOnTop、現在のアプリ内の他のすべてのフォームの上にとどまり、他の実行中のアプリ全体のすべてのウィンドウではないと仮定しています。

4

3 に答える 3

0

もう少し情報と可能な解決策。

floatform を fsnormal に設定します。

mainform.activate イベントが発生したら、floatingform.bringtofront を呼び出します。

しかし、他のすべてのアプリ ダイアログにも stayontop を使用しています。アプリの複数のコピーが実行されている場合、ダイアログは同じ問題を示します (つまり、app1 でダイアログが開いていて、alt キーを押してダイアログから離れている場合、他のすべてのプログラムよりも上位に表示される可能性があります)。

于 2010-03-17T09:07:19.970 に答える
0

私はこの分野のバグを知りません。

まず、プロセスがどのように機能するかを説明しましょう。

DelphifsStayOnTopは、フォームを保持するウィンドウの作成中に、パラメータを指定して win32 関数SetWindowPosを呼び出すことにより、最初にスタイルを使用しHWND_TOPMOSTます。

の詳細な説明については、http://msdn.microsoft.com/en-us/library/ms633545SetWindowPos (VS.85).aspx を参照してください。

アプリケーションが非アクティブ化または最小化されるたびに、Delphi はすべての最上位フォームを列挙してフォームを正規化し(正規化とは、vcl が使用する用語で、最上位にあるウィンドウが最上位にならないようにすることを意味します)、すべてのフォームの内部リストを保持します。その瞬間一番上にあった窓。

アプリケーションがアクティブ化または復元されるたびに、Delphi は最上位のウィンドウのリストに格納されている情報を使用して、最上位のすべてのフォームを復元します(setWindowPoswithHWND_TOPMOSTパラメータを使用) 。

したがって、アプリケーションが最小化されているときにウィンドウを列挙しているときに、Delphi が情報を格納する方法に問題があるようです。

最小化または非アクティブ化機能をハックして、一番上のウィンドウ リスト (上にあるApplication.FTopMostList) が正しくリストされているかどうかを確認します。

于 2010-03-17T09:43:57.700 に答える
-1

私は同様の問題を抱えていましたが、このリンクは私を大いに助けてくれます: Delphi: Win7 で fsStayOnTop を使用したバルーン フォームが機能しない

Application.NormalizeTopMosts() 関数を呼び出すと、一番上のフォームが期待どおりに動作します。

于 2012-03-09T13:38:34.917 に答える