DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームを一度閉じたら開けない?!

分類:[.NET]

VB.NET(Windowsフォーム)で作っています。初心者です。
二つのフォームを用意し、
Form1のボタンでForm2を開きます。
Form2は一画面しか開けないようにするため、
Form2のインスタンス生成はイベントの外で行っています。

Form1のボタンの処理を下に示します。

Public frm As New Form2()

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
frm.Show()
End Sub

Form2を開いたら、右上のXボタンでForm2を閉じ、
再度Form1のボタンでForm2を開こうとすると、下記エラーが発生します。

「'System.ObjectDisposedException' のハンドルされていない例外が
system.windows.forms.dll で発生しました。
追加情報 : "Form2" という名前の、破棄されたオブジェクトにアクセスでき
ません。」

ShowDialogやHideを使わずに、
同じ画面を何個も開くことを回避する方法は無いでしょうか?
> Form2は一画面しか開けないようにするため、
> Form2のインスタンス生成はイベントの外で行っています。

提示のコードだといくつでもForm2を開けてますよ。
厳密に制御したいわけでなければ現行の方法でも構いませんが、
厳密に一つだけに制御したいなら、デザインパターンのSingletonが使えると思います。

> Public frm As New Form2()

下記のようにプロパティにしてしまい、
IsDisposedプロパティを見て、破棄済みだったらインスタンスを
再作成するようにすればOKかと思います。
(下記コードでは提示コードのfrmに代わるのがForm2プロパティ)

Private f2 As Form2

Public Property Form2() As Form2
Get
If f2 Is Nothing OrElse f2.IsDisposed Then
f2 = New Form2
End If
Return f2
End Get
Set(ByVal Value As Form2)
f2 = Value
End Set
End Property
よねKENさん、早速のお返事ありがとうございます。

よねKENさんのおっしゃる通りにプログラムを修正したところ、
うまく行きました。

実際にそういうケースって、よくあると思うんですけど、
みなさん、If文で破棄されたかどうか判断して
インスタンスを生成する方法を使ってるんでしょうか?

VBだと、ただShowって書けば何度でも開閉できますけど、
VB.NETだと、ソースもそんなにすっきりと書けないものなんですね。

DOBON.NET | プログラミング道 | プログラミング掲示板