投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/3/12 12:46:22
> Form1を閉じるとForm2も閉じます。

Form1 がスタートアップフォームだったからでしょう。


では実験。

Form3 を追加して、Form3 の Load イベントに「Form1.Show()」と言うコードを書いてください。

次に、アプリケーションが Form3 から開始されるよう、
プロジェクトのプロパティの「アプリケーション」タブを開き、
以下のように設定します。

 スタートアップ フォーム: Form1 → Form3 に変更
 シャットダウンモード:スタートアップ フォームが閉じる時


この状態で実行すると Form3 と Form1 が同時に現れるので、
Form1 のボタンから Form2 を呼び出してみます。

この場合、スタートアップフォームである Form3 を閉じると、
全てのフォームが閉じられ、アプリケーションごと終了するはずです。

一方、Form1 と Form2 はそれぞれ独立して閉じられるようになっているはずです。
Form1 を閉じたからと言って、Form2 や Form3 が閉じられることはありませんし、
Form2 を閉じたからと言って、Form1 や Form3 が閉じられることも無いはずです。


Owner 指定しない状態で、別フォームを連動して閉じさせたいなら、
FormClosing/FormClosed イベントのタイミングで
相手側のフォームの Close() メソッドを呼び出すコードを
記述する必要があります。



> childForm = Nothing
> は書いていませんが

Nothing 代入は、フォームを閉じる命令ではありません。
不要になった参照を捨てているだけです。


Form2 を閉じた後に、Form1 の Button1 をもう一度クリックしてみてください。
破棄された Form2 インスタンスを childForm.Show() しようとして、
ObjectDisposedException の例外が発生することになるはずです。

それを避けるため、Form2 が閉じられたことを FormClosed イベントで監視し、
以前のインスタンスを解放しているということです。



説明ついでに、Form2 にボタンを追加して、「Me.Hide()」と書いてみてください。
これは Me.Visible = True と同義であり、フォームを非表示にする命令です。

Form2 が非表示になった場合、見た目上は閉じられたのと変わりありませんが、
本当に閉じられたわけでは無いため、FormClosed イベントは発生しません。
閉じられていないという事は、オブジェクトも破棄されていない状態ですから、
元の childForm インスタンスを Show() しなおしたとしても、上記のような
ObjectDisposedException 例外は発生せず、単に「再表示」されるだけとなります。



> 当方、2013を使っていますが、前のコードの場合、バージョンはいくつでしょうか?

ReadOnly な自動実装プロパティは、VB2015 からサポートされました。
すなわち、VB2015/2017/2019 向けに書かれたコードであったという事です。

「自動実装プロパティ」自体は 2010 から搭載されたものなのですが、
この時点では ReadOnly や WriteOnly にすることはできませんでした。

再提示した方の実装であれば、VB2005 以上に対応できます。
(VB.NET 2002/2003 まで遡る場合は、さらなる書き換えが必要になります)