対象のフォームが開いているかどうかを確認するには?

解決


フォーリン☆  2009-07-09 23:18:32  No: 142180

環境:VB2008 OS XP Pro SP3
今、VBを勉強中で、Form1からForm2を開いて、Form2内でいろいろと入力を行おうとしています。
そこで、Form1のボタンButton1をクリックしたときに、Form2を開きたいのですが、以下のようにしたいのです。
・Form2が開いていない場合は、Form2のインスタンスを作成し、Form2を開く。
・Form2がすでに開いている場合は、Form2を前に持ってくる。
  (アクティブにすると言えばいいのでしょうか?)
しかし、以下のようなコードにしてしまうと、ボタンButton1をクリックするたびに、Form2が複数開いてしまいます。

'Form1のコードの一部
Private f2 As Form2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    f2 = New Form2
    f2.Show()
End Sub

フォーム変数f2が開いているかどうかを判断したいのですが、変数f2がNothingかどうかで判断した場合、
一度Form2を開いてから閉じた場合、f2はNothingではないのでこの判定方法が使えません。
どのようにしてフォーム変数f2が開いているかどうかを判断すればよいでしょうか?
ご教示の程よろしくお願いします。


フォーリン☆  2009-07-10 00:23:40  No: 142181

自己レスです。
Application.OpenFormsコレクションを利用し、開いているFormの情報(例えばTextプロパティ)を取得し、
これで判断することにしました。


特攻隊長まるるう  2009-07-10 00:56:28  No: 142182

別解としてフォームを開くのは自分なのだから、インスタンスへの参照を
自分の用意した変数に覚えておくというのもあります。

一昔前はモジュール変数を用意したりしていましたが、外部に依存する
設計になり使い難く良くない設計なため、内部の静的な変数に覚える
方法がお勧めです。
[DOBON.NET Tips フォームが一つしか表示されないようにする]
http://dobon.net/vb/dotnet/form/singleform.html#section3
この上で New のスコープを Private にしてしまうと、Instance プロパティ
からのみ、そのフォームのインスタンスを取得できる設計が可能です。

#「シングルトン」という単語も覚えておくと良いかもしれません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加