現在ログインしていません。
新規アカウント作成
ログイン

イベントはハンドラに対して複数持つことができる

親フォームと子フォーム

以前、親フォームと、それに付属する MDIChildren の子フォームを持つ画面を作成いたしました。

その際に、子フォームをドラッグして動かした際に、子画面のラベルにその座標を表示し、 かつ、親フォーム側で動かしたことを検知してフラグを立てる、ということをしたいと思ったのです。

親フォーム側で子フォームを生成して MDIChildmen とする

まず、親フォーム側で以下のサブプロシージャを作成します。

    Private m_ChildMovedFlag As Boolean = False '子フォームが動いたときに立てたいフラグ
    Private Sub ChildTextFormMove(sender As Object, e As EventArgs)
        m_ChildMovedFlag = True
    End Sub
■リスト1:

このサブプロシージャには Handles ~ がついていませんので、この時点ではどこからも呼ばれません。

ですので、子フォームを生成するとき、このサブプロシージャをイベントとしてハンドルにくっつけてやります。

    'ボタンを押したか何かで呼ばれるサブプロシージャ
    Private Sub addChild()
        Dim child As New ChildTextForm()
        child.MdiParent = Me
        child.Show()
        AddHandler child.Move, AddressOf Me.ChildTextFormMove 'ここでハンドルにくっつける
    End Sub
■リスト2:

これで、親フォーム側で子フォームが動いたときにフラグを立てることができるようになります。

子フォーム側でもイベントを発生させる

子フォームは子フォームで Move イベントの際にラベルに座標を表示したいということでしたので、そのようにロジックを組みます。

    'こちらは後ろに Handles ~ がくっついている
    Private Sub ChildTextForm_Move(sender As Object, e As EventArgsHandles MyBase.Move
        lbl_Locate.Text = "(" & Me.Left.ToString() & ", " & Me.Top.ToString() & ")"
    End Sub
■リスト3:

親画面のサブプロシージャのイベントと子画面のイベントが両方発生する

上記のようにコーディングすると、親画面側の処理も子画面側の処理も両方働きます。

つまり、親画面側のフラグを立てつつ、子画面側でラベルに座標を表示することができるのです。