ラベル VB6 の投稿を表示しています。 すべての投稿を表示
ラベル VB6 の投稿を表示しています。 すべての投稿を表示

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