イベントはハンドラに対して複数持つことができる
親フォームと子フォーム
以前、親フォームと、それに付属する 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 イベントの際にラベルに座標を表示したいということでしたので、そのようにロジックを組みます。
Private Sub ChildTextForm_Move(sender As Object, e As EventArgs) Handles MyBase.Move
lbl_Locate.Text = "(" & Me.Left.ToString() & ", " & Me.Top.ToString() & ")"
End Sub
■リスト3: 親画面のサブプロシージャのイベントと子画面のイベントが両方発生する
上記のようにコーディングすると、親画面側の処理も子画面側の処理も両方働きます。
つまり、親画面側のフラグを立てつつ、子画面側でラベルに座標を表示することができるのです。