2013年11月13日水曜日

VB6でマルチキャストイベントの実験

VBにもイベント機構が存在しているが、イベントリスナーが複数の時、どのような動きをするのだろうか? というわけで、実験してみた。

まず、イベントを持つクラスを作る。(以下、イベントクラス)
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 件のコメント:

コメントを投稿