Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
Form1とForm2で、クリックした方が前に出るようにしたい
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30458#CommentId83816
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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 まで遡る場合は、さらなる書き換えが必要になります)