6

Delphi MDIアプリケーションでタイマーを実行していますが、バックグラウンドで何かが変更された場合に、タイマーを使用してメッセージをポップアップ表示したいと思います。ただし、アプリケーションのフォアグラウンドにモーダルダイアログがある場合、ユーザーはそれについて何もできなかったため、そのメッセージがポップアップ表示されないようにします。

では、私が知りたいのは、アプリケーションにモーダルダイアログが存在するかどうかをどのように確認できるかということです。

4

5 に答える 5

11

このコードで試すことができます:

var
  ActForm: TCustomForm;
begin
  ActForm := Screen.ActiveForm;
  if (ActForm = nil) or not (fsModal in ActForm.FormState) then begin

  end;
end;

Delphi 4でテストしましたが、うまくいきました。

[編集]: しかし、フォームをポップアップしてフォーカスを盗むことが良い考えかどうかを本当に考えるべきです。アプリケーションによって異なりますが、ユーザーが現在編集フィールドに何かを入力している場合、またはマウスで何かを実行している場合、ワークフローが中断される可能性があります。

于 2008-11-12T17:01:07.850 に答える
7

Delphi 2005 以降、 TApplication にModalLevelプロパティがあります。アプリケーションで開かれたモーダル フォームの数をカウントします。

于 2008-11-13T08:21:11.627 に答える
2

AnyPopup () 関数を使用する

GetLastActivePopup ()について。戻り値は、hWnd パラメータと同じ場合があります。

  • hWnd によって識別されるウィンドウは、最近アクティブでした。
  • hWnd で識別されるウィンドウは、ポップアップ ウィンドウを所有していません。
  • hWnd によって識別されるウィンドウは、最上位のウィンドウではないか、別のウィンドウによって所有されています。
于 2010-07-22T08:01:35.230 に答える
2

おそらく解決策は、フォーカスを奪わないヒントを実際にポップアップすることです。目に見える場所にクリック可能なヒントがありますが、あまり侵略的ではありません。したがって、ユーザーがアクションを実行したい場合、または実行していたことを終了することができる場合は、アクションを実行します。または、完全に無視することもできます。

于 2008-11-12T17:37:56.997 に答える
1

今日、ユーザーhistrioは別のスレッドで、モーダルな Delphi フォームを監視するだけでは不十分であると正しく答えました。ウィンドウには、モーダル ダイアログを設定することもできます。

別のスレッドでの彼の答えは、それを確認する方法を示しています。

--jeroen

于 2010-07-22T07:45:19.400 に答える