• ベストアンサー

フォームの存在をチェックする方法

みなさんこんばんわです。よろしくお願いします。 VB.NET 2008で開発をしています。フォームについて、どうしてもわからない点がありますのでお伺いいたします。 Form1、Form2があるとします。 Form1.Visible = False とすれば、Form1のインスタンスは残ったまま、非表示なだけです。一方、 Form1.Close() Form1.Dispose() とすれば、Form1は完全にメモリ上から解放されています。つまり、Form1上のコントロールから値を取得しようとするとエラーになりますよね。 つまり、上記の二つのケースをForm2から判断したいのですが、そのコードが分からないんです。Form2のコードで、Form1のインスタンスが存在するかどうか、つまり、Form1上のコントロールの値を参照することができるかどうかを知りたいんです。 具体的には、実際のイメージはForm3まであって、Form1が不可視で生きていれば、Form1上のコントロールの値を参照し、Form2が不可視で生きていれば、Form1は無視してForm2上のコントロールの値を参照するという具合です。 ちなみに、 If Form1.Visible = False Then Debug.Print("生きてます") のコードでは、Form1のインスタンスがメモリ上にあってもなくても、不可視であれば、同じ値を返すことがわかり、役に立ちません。 ご存じの方がいらっしゃいましたら、たいへんお手数をおかけしますが、どうぞよろしくお願い申し上げます。 ありがとうございました。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

NameSpace Myの中の Appliaction.OpenFormsで Closeしたかどうかが分かるようですよ Form2側のチェックイベントで if My.Appliaction.OpenForms("Form1") isnot Nothing then   Debug.Print("生きています") end if といった具合です

suiyoudoudesyou
質問者

お礼

ご回答ありがとうございます。 すごいです! こんな方法があったんですね! 実験してみると、見事に成功しました!! 望んだとおりの結果を得ることが出来、とても感謝しています。 ありがとうございました!!!

その他の回答 (1)

回答No.1

> Form1.Close() > Form1.Dispose() > とすれば、Form1は完全にメモリ上から解放されています。つまり、Form1上のコントロールから値を取得しようとするとエラーになりますよね。 VB2005で試してみましたがエラーは出ませんでした。 DisposeによってForm1が抱えるリソースは解放されますが、Form1の参照自体は削除されません。さらにVBの場合はDisposeしたForm1へ何らかのアクセスを試みたときに新しいインスタンスが自動的に作成されます。VB特有の「既定のインスタンス」による動作です。(2008で動作が異なるかどうかは不明) 既定のインスタンスを使わず、Formを変数で管理するのであれば、IsDisposedプロパティを調べることでDisposeされたかどうかを調べることが出来るのですが、既定のインスタンスでは上記の通りインスタンスを作り直してしまうので、IsDisposedは常にFalseを返します。 既定のインスタンスによるFormがDisposeされたかどうかを得るには、SharedなプロパティをForm1に持たせ、Disposeする時にフラグを立てれば大丈夫かと。 Class Form1 Friend Shared FormDisposed As Boolean = False Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed Form1.FormDisposed = True End Sub End Class

suiyoudoudesyou
質問者

お礼

ご回答ありがとうございます。 そうなんです! ロードしてないフォームを参照してエラーが出るなら、そのエラーをTry..Catch..Finallyでキャッチすることも考えましたが、実際やってみると、参照できるんです! すみません、実験もせずに投稿してしまいまして・・・・ 起動時にすべてのフォームがインスタンスとしてメモリ上に存在するのかと思いきや、そうなんですね、参照した際に勝手に作り直されるんですかー! なるほど、よくわかりました。公開変数でフラグを立てる方法は考えてはいたのですが、スマートじゃないなと思ってまして・・・ ありがとうございました!

関連するQ&A