none
Form2の起動方法について RRS feed

  • 質問

  • Form1からForm2を起動させる方法について

    教えて頂きたく投稿しました。

    Form2の重複起動を避けて、Form2をモーダルフォームとして起動させたいと思います。

    Private Sub  hoge()
           Dim f2 As Form2
            If f2.Visible = False Then   <-----(*1)
                f2 = New Form2(Me)
                f2.ShowDialog()
            Else
                f2.Activate()
            End If
    End Sub

    (*1)のf2部位で、次のエラーメッセージが出ました。

    警告    1    変数 'f2' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。

    多重起動防止には、この方法が良さそうに思えますが、他に良い方法がありますか。

    Form2を閉じるには、Form2のclose()で閉じようと思います。 ← 何か対策をしておいた方が良いですか。

    何卒、ご教示下さい。

    よろしくお願いします。

    2013年4月19日 15:03

回答

  • f2 での操作の結果、hoge 関数を呼べるルートがあるとまずいなぁと思って書いていました。
    Me を渡していますが、間接的に hoge 関数を呼ばないようになっている のであれば、確かにそれでいいかもです。

    ただ、Dispose 漏れしているので、Using ステートメントを使う点は提案しておきたいと思います。

    Private Sub  hoge()
        Using f2 As New Form2(Me)
            f2.ShowDialog()
        End Using
    End Sub 
    2013年4月20日 12:18
    モデレータ
  • f2 は 1 度の hoge 関数の実行中でしか有効でなく、次の hoge 関数実行時には空の状態からスタートします。
    つまり、あなたがやりたかったことが実現できていません。

    f2 をクラスのフィールド変数にする必要があるでしょう。
    そして、初回は f2 が Nothing になっているので、まずは Nothing でないことを検証し、次に IsDisposed プロパティ、その次に Visible プロパティという検証が必要でしょう。

    2013年4月19日 15:13
    モデレータ
  • taokato さま よろしく。

    Form1 が Public Class Form1 で Form2 が Public Class Form2 で書かれているものとして

    Form1 の とあるイベントハンドラから次のコードで、モーダルフォームとして起動できると重います。

     Form2.ShowDialog()

    それだけで良いと思います。

    あっ、Form2 から抜けるときは  Form2.vb で Me.Close() です。

    2013年4月19日 15:27
  • というか、モーダル起動にしたいんですよね?
    だとしたら重複起動の制御っていらなくないですか?

    単純に

    Private Sub  hoge()
    	Dim f2 As New Form2(Me)
    	f2.ShowDialog()
    End Sub
    で良くないですか?
    ※もしも別プロセス含めた重複起動の制御ってなると話が変わりますが・・・
    • 回答としてマーク taokato 2013年4月20日 9:49
    2013年4月20日 5:24

すべての返信

  • f2 は 1 度の hoge 関数の実行中でしか有効でなく、次の hoge 関数実行時には空の状態からスタートします。
    つまり、あなたがやりたかったことが実現できていません。

    f2 をクラスのフィールド変数にする必要があるでしょう。
    そして、初回は f2 が Nothing になっているので、まずは Nothing でないことを検証し、次に IsDisposed プロパティ、その次に Visible プロパティという検証が必要でしょう。

    2013年4月19日 15:13
    モデレータ
  • taokato さま よろしく。

    Form1 が Public Class Form1 で Form2 が Public Class Form2 で書かれているものとして

    Form1 の とあるイベントハンドラから次のコードで、モーダルフォームとして起動できると重います。

     Form2.ShowDialog()

    それだけで良いと思います。

    あっ、Form2 から抜けるときは  Form2.vb で Me.Close() です。

    2013年4月19日 15:27
  • ShiroYuki_Mot 様

    ありがとう御座います。

    モーダルフォームとしての起動方法を、理解出来ました。

    m(__)m

    2013年4月20日 3:05
  • Azulean(MVP)  様

    すみません。私の頭がついて行けていないので、ソースコードに落として頂けると助かるのですが・・・。

    因みに、Form2側を下記のようにしてあります。

        'Form1の宣言
    
        Private F1 As Form1
    
        'フォーム起動時に親から呼び出される
        Sub New(form1 As Form1)
            ' TODO: Complete member initialization 
            InitializeComponent() 'これは必ず必要です
    
            F1 = form1
        End Sub
    

    2013年4月20日 3:40
  • というか、モーダル起動にしたいんですよね?
    だとしたら重複起動の制御っていらなくないですか?

    単純に

    Private Sub  hoge()
    	Dim f2 As New Form2(Me)
    	f2.ShowDialog()
    End Sub
    で良くないですか?
    ※もしも別プロセス含めた重複起動の制御ってなると話が変わりますが・・・
    • 回答としてマーク taokato 2013年4月20日 9:49
    2013年4月20日 5:24
  • f2 での操作の結果、hoge 関数を呼べるルートがあるとまずいなぁと思って書いていました。
    Me を渡していますが、間接的に hoge 関数を呼ばないようになっている のであれば、確かにそれでいいかもです。

    ただ、Dispose 漏れしているので、Using ステートメントを使う点は提案しておきたいと思います。

    Private Sub  hoge()
        Using f2 As New Form2(Me)
            f2.ShowDialog()
        End Using
    End Sub 
    2013年4月20日 12:18
    モデレータ