例外を引き起こすこの厄介な状況があります。私は問題を見つけましたが、解決策を実装するのは今のところ難しいです。
私たちのアプリケーションでは、ユーザーが一定時間アクティブでない場合、セキュリティ タイムアウト手順が開始され、ユーザーにパスワード入力ボックスが表示されます。
ただし、FormShow()
イベント中に何らかの理由でフォームにメッセージ ボックスが表示された場合 (ここで注意する必要があります。formShow
イベントの実行はまだ完全には完了していません)、ユーザーはダイアログ ボックスの [OK] ボタンをクリックしないことにしました。ある時点で、セキュリティ コードが作動し、すべてのフォームを非表示にして、パスワードを要求できるようにします。このシナリオでは、 「OnShow または OnHide で Visible を変更できません」という例外がトリガーされます。
セキュリティ コードは、すべてのフォームを使用してループし、個別に使用TScreen.FormCount
して非表示にします。TForm(TScreen.Forms[ii]).Hide
このフォームはまだロード手順を完全に完了していないと思うので、手順を非表示にすると例外が発生します。
テストを行ったところ、FormShow() イベントの実行後にメッセージ ボックスを表示すると、セキュリティ コードは問題なく機能し、すべてのウィンドウが問題なく非表示になりました。
Screen.Forms[ii].Visible、Screen.Forms[ii].Active など、フォームを非表示にする前に「if チェック」を実行するために、いくつかのプロパティとウィンドウ メッセージ チェックを試しましたが、今のところうまくいきません。上記のフォームは表示されますが、アクティブであるという保証はありません。アクティブな場合、他の非アクティブなフォームを非表示にするにはどうすればよいですか。だから私の質問は、どのプロパティまたは Windows メッセージが、フォームが完全に読み込まれたこと、または少なくともFormShow
フォームに存在する特定のフォームのイベントを過ぎたことを示すTScreen.Forms
でしょうか?
私が求めていることへの回答が必要です。セキュリティ コードに実装する必要がある一般化されたソリューションが必要です。この巨大なアプリケーションにある 1,000 を超えるフォームを調べて、個別に解決策を見つけようとすることはできません。これらのフォームには検証/警告ロジックが存在します。
ありがとうございました