アプリ版:「スタンプのみでお礼する」機能のリリースについて

みなさんこんばんわです。よろしくお願いします。

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のインスタンスがメモリ上にあってもなくても、不可視であれば、同じ値を返すことがわかり、役に立ちません。


ご存じの方がいらっしゃいましたら、たいへんお手数をおかけしますが、どうぞよろしくお願い申し上げます。
ありがとうございました。

A 回答 (2件)

NameSpace Myの中の Appliaction.OpenFormsで Closeしたかどうかが分かるようですよ



Form2側のチェックイベントで
if My.Appliaction.OpenForms("Form1") isnot Nothing then
  Debug.Print("生きています")
end if
といった具合です
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。

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

ありがとうございました!!!

お礼日時:2009/10/11 23:46

> 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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

そうなんです! ロードしてないフォームを参照してエラーが出るなら、そのエラーをTry..Catch..Finallyでキャッチすることも考えましたが、実際やってみると、参照できるんです! すみません、実験もせずに投稿してしまいまして・・・・

起動時にすべてのフォームがインスタンスとしてメモリ上に存在するのかと思いきや、そうなんですね、参照した際に勝手に作り直されるんですかー!

なるほど、よくわかりました。公開変数でフラグを立てる方法は考えてはいたのですが、スマートじゃないなと思ってまして・・・

ありがとうございました!

お礼日時:2009/10/11 23:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A