忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

フォームクラス生成時に設定値を同時に渡す方法

あるフォームから別のフォームを表示し、その子フォームでの情報を親のフォームからアクセスしたい場合に、 子フォームにプロパティを持ち、それを介してデータのやり取りを行う方法は以下のソースの様になることを以前紹介しました。

プロパティを持つ子フォームのクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
''' <summary>
''' プロパティを持つ子フォーム
''' </summary>
Public Class frmProperty
 
    'チェック状態退避値
    Private mblnChkStatus As Boolean = False
 
    ''' <summary>
    ''' チェック状態プロパティ
    ''' </summary>
    ''' <value>チェック状態の設定値</value>
    ''' <returns>チェック状態を返す</returns>
    Public Property ChkStatus As Boolean
        Set(value As Boolean)
            mblnChkStatus = value   '退避値に設定
        End Set
        Get
            Return mblnChkStatus    '退避値を返す
        End Get
    End Property
 
    ''' <summary>
    ''' ボタンクリックイベント
    ''' </summary>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'チェックボックスの状態を退避
        Me.mblnChkStatus = Me.CheckBox1.Checked
        '自分を閉じる
        Me.Close()
    End Sub
 
    ''' <summary>
    ''' フォームロードイベント
    ''' </summary>
    Private Sub fomProperty_Load(sender As Object, e As EventArgs) Handles Me.Load
        'チェックボックスの初期状態設定
        Me.CheckBox1.Checked = Me.mblnChkStatus
    End Sub
 
End Class

この子フォームを呼出す親フォームの処理が以下の様になります。

子フォームを呼出す親フォームの処理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
''' <summary>
''' 子フォームを呼出す親フォーム
''' </summary>
Public Class frmPropMain
 
    ''' <summary>
    ''' ボタンクリックイベント
    ''' </summary>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'プロパティテストウインドウ生成
        Dim frmProp As New frmProperty
        'プロパティに自分のチェックボックスの値を設定
        frmProp.ChkStatus = Me.CheckBox1.Checked
        'ウインドウ表示
        frmProp.ShowDialog()
        'プロパティ値を自分のチェックボックスの値に設定
        Me.CheckBox1.Checked = frmProp.ChkStatus
        'プロパティテストウインドウ廃棄
        frmProp.Dispose()
        frmProp = Nothing
    End Sub
 
End Class

この例では子フォームを生成した後で、子フォームのプロパティを設定しています。二回に分けて処理をしますので少し面倒ですね。
この面倒さを解消するには、子フォームクラスの生成に引数として渡せればできるのです。

実際にどの様にするのかを、上記のソースを土台にして変えていきます。 尚、今回の例ではフォームクラスの名前を frmConstructor と変えています。

ソースは上記の frmProperty を全てコピーしてきて、その後でクラスの先頭辺りで Sub New とキー入力します。 そうすると、以下の様な感じで Sub New() の関数が自動で表示されます。

コンストラクタを明示する子フォームのクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
''' <summary>
''' コンストラクタを明示する子フォーム
''' </summary>
Public Class frmConstructor
 
    Sub New()
 
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
 
    End Sub
 
    'チェック状態退避値
    Private mblnChkStatus As Boolean = False
 
    ''' <summary>
    ''' チェック状態プロパティ
    ''' </summary>
    ''' <value>チェック状態の設定値</value>
    ''' <returns>チェック状態を返す</returns>
    Public Property ChkStatus As Boolean
        Set(value As Boolean)
            mblnChkStatus = value   '退避値に設定
        End Set
        Get
            Return mblnChkStatus    '退避値を返す
        End Get
    End Property
 
    ''' <summary>
    ''' ボタンクリックイベント
    ''' </summary>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'チェックボックスの状態を退避
        Me.mblnChkStatus = Me.CheckBox1.Checked
        '自分を閉じる
        Me.Close()
    End Sub
 
    ''' <summary>
    ''' フォームロードイベント
    ''' </summary>
    Private Sub fomProperty_Load(sender As Object, e As EventArgs) Handles Me.Load
        'チェックボックスの初期状態設定
        Me.CheckBox1.Checked = Me.mblnChkStatus
    End Sub
 
End Class


この後で Sub New() に引数を宣言し、フォーム生成時にプロパティが設定できる様に以下の様にソースを変更します。

コンストラクタ(引数設定)を明示する子フォームのクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
''' <summary>
''' コンストラクタを明示する子フォーム
''' </summary>
Public Class frmConstructor
 
    Sub New(ByVal blnChk As Boolean)
 
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
 
        'プロパティを設定する
        Me.ChkStatus = blnChk
    End Sub
 
    'チェック状態退避値
    Private mblnChkStatus As Boolean = False
 
    ''' <summary>
    ''' チェック状態プロパティ
    ''' </summary>
    ''' <value>チェック状態の設定値</value>
    ''' <returns>チェック状態を返す</returns>
    Public Property ChkStatus As Boolean
        Set(value As Boolean)
            mblnChkStatus = value   '退避値に設定
        End Set
        Get
            Return mblnChkStatus    '退避値を返す
        End Get
    End Property
 
    ''' <summary>
    ''' ボタンクリックイベント
    ''' </summary>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'チェックボックスの状態を退避
        Me.mblnChkStatus = Me.CheckBox1.Checked
        '自分を閉じる
        Me.Close()
    End Sub
 
    ''' <summary>
    ''' フォームロードイベント
    ''' </summary>
    Private Sub fomProperty_Load(sender As Object, e As EventArgs) Handles Me.Load
        'チェックボックスの初期状態設定
        Me.CheckBox1.Checked = Me.mblnChkStatus
    End Sub
 
End Class

子フォームの生成時に引数を設定し処理する例として以下のソースに示します。

引数を持って子フォームを呼出す親フォームの処理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
''' <summary>
''' 引数を持って子フォームを呼出す親フォーム
''' </summary>
Public Class frmConstructorMain
 
    ''' <summary>
    ''' ボタンクリックイベント
    ''' </summary>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'プロパティテストウインドウ生成(自分のチェックボックスの値を引数)
        Dim frmConst As New frmConstructor(Me.CheckBox1.Checked)
        'ウインドウ表示
        frmConst.ShowDialog()
        'プロパティ値を自分のチェックボックスの値に設定
        Me.CheckBox1.Checked = frmConst.ChkStatus
        'プロパティテストウインドウ廃棄
        frmConst.Dispose()
        frmConst = Nothing
    End Sub
 
End Class

もし、引数在りでも無しでも両方の子フォームのコンストラクタを持ちたい場合には、 以下の様に引数無しの Sub New() をもう1個宣言すればできます。

この方法は オーバーロード と言われるもので、引数や戻り値が異なるが名前が同じの関数を複数定義する方法です。
(この場合は Sub の宣言ですが、 Function の場合でも同じ様にできます。)

コンストラクタ(引数設定)を明示する子フォームのクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
''' <summary>
''' コンストラクタを明示する子フォーム
''' </summary>
Public Class frmConstructor
 
    Sub New(ByVal blnChk As Boolean)
 
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
 
        'プロパティを設定する
        Me.ChkStatus = blnChk
    End Sub
 
    Sub New()
 
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
 
    End Sub
 
    '以下のソースは省略.....
 
End Class

関連する記事

フォームクラス生成時に設定値を同時に渡す方法
フォーム上の複数のコントロール(TextBox)の入力変化を確認する方法について
フォームのマウスカーソルを待機状態する方法について
フォームクラスの継承の方法について

おすすめ本

share











PR

コメント

コメントを書く