まず、イベントを持つクラスを作る。(以下、イベントクラス)
Invokeメソッドを呼ぶと、イベントを発動するだけのクラスである。
Option Explicit
'イベントハンドラ
Public Event Hello(message As String)
'イベント発動のためのメソッド
Public Sub Invoke()
    RaiseEvent Hello(DateTime.Now)
End Sub
MainFormは、イベントクラスのインスタンスを持っている。MainFormもイベントを購読している。
CreateSubFormボタンを押すとSubFormを作り、イベントクラスの参照を渡す。SubFormのRaiseボタンを呼ぶと、イベントクラスのInvokeを呼ぶ。
すべてのイベントハンドラが呼ばれた!
以下は、フォームのソースコード
Option Explicit
'イベントを持つクラス
Public WithEvents ObjWithEvent As ClassWithEvent
'イベントハンドラに相当
Private Sub ObjWithEvent_Hello(message As String)
    Me.Caption = message
End Sub
'クラスにイベント発動を依頼
Private Sub RaiseButton_Click()
    ObjWithEvent.Invoke
End Sub
'コンストラクタの代わり
Public Sub Init(obj As ClassWithEvent)
    Set ObjWithEvent = obj
End Sub
Option Explicit
'イベントを持つクラス
Public WithEvents ObjWithEvent As ClassWithEvent
'フォームを並べて表示するのに使用
Private lastTop As Long
'イベントハンドラに相当
Private Sub ObjWithEvent_Hello(message As String)
    Me.Caption = message
End Sub
'サブフォームを作る
Private Sub SubFormCreateButton_Click()
    Dim Form As New SubForm
    Call Form.Init(ObjWithEvent)
    Form.Left = Me.Left
    Form.Top = lastTop
    Form.Show
    lastTop = Form.Top + Form.Height '縦に並べる
End Sub
'アプリ強制終了
Private Sub ExitButton_Click()
    End
End Sub
'フォーム初期化
Private Sub Form_Load()
    Set ObjWithEvent = New ClassWithEvent
    lastTop = Me.Top + Me.Height
End Sub


 
0 件のコメント:
コメントを投稿