タイトル | : Re: MDIフォームで閉じた画面まで取得できてしまう |
記事No | : 16022 |
投稿日 | : 2014/11/20(Thu) 14:16 |
投稿者 | : 魔界の仮面弁士 |
> MDIChildの画面を1つ閉じて、複数件ある場合に閉じた画面も検出されてしまいます。 その『閉じた画面』が「Unload イベント」に至っていないのであれば、 Forms コレクションには残ったままとなります。
閉じたフォームの状態がどうなっているか分かりますか?
ここでいう状態とは、VB6 ヘルプの
+[Visual Basic ドキュメント] +[Visual Basic の使用方法] +[プログラミング ガイド] +[Visual Basic を使って出来ること] +[オブジェクト] +[独自のクラスの作成] +[Visual Basic フォームの有効期間]
の項にある、下記の記述のことです。
》 Visual Basic のフォームは、その有効期間中、通常 4 つの状態を通過します。 》 1. 作成されているが、ロードされていない。 》 2. ロードされているが、表示されていない。 》 3. 表示されている。 》 4. メモリおよびシステム リソースが完全に解放されている。
Forms コレクションが管理しているのは、状態 2 と 状態 3 ですが、 その点の認識は問題ないでしょうか?
Forms.Count プロパティが返す値は、ロード中のフォーム全て(状態 2 と 状態 3)で、 DoEvents 関数の戻り値が表す値は、表示されているフォーム全て(状態 3 のみ)です。
下記のようにしておくと、フォームの遷移状態をトレースできます。
Option Explicit
Private Sub Form_Initialize() Debug.Print Hex(ObjPtr(Me)), TypeName(Me) & " is Initialized" End Sub
Private Sub Form_Load() Debug.Print Hex(ObjPtr(Me)), TypeName(Me) & " is Loaded, HWND = " & Hex(Me.hWnd) End Sub
Private Sub Form_Unload(Cancel As Integer) Debug.Print Hex(ObjPtr(Me)), TypeName(Me) & " is Unloaded" End Sub
Private Sub Form_Terminate() Debug.Print Hex(ObjPtr(Me)), TypeName(Me) & " is Terminated" End Sub
> 複数件ある場合に閉じた画面も検出されてしまいます。
閉じた画面、というものが 「Hide メソッド、もしくは Visibile = False による非表示状態」 もしくは 「Unload はされたが、何らかの理由で再度ロードされた非表示状態」 の場合、Forms で列挙されることになります。
表示されているかどうかを調べる場合は、Visible プロパティで分かります。 ただし、状態 1 にあるフォームの Visible プロパティを参照した場合、 自動的に状態 2 に遷移してしまいますので、その点は注意してください。
それともう一つ。For Each での列挙中に、フォームのロードやアンロードを 行っていないかも確認しておいてください。列挙中にコレクションの要素数が増減すると 列挙処理が正しく行われなくなりますので。
|