異なるクラスのイベントをまとめたい。

環境:VB6SP6/XP

こんなところに書かずにVisual Basic 初心者掲示板に書き込めと突っ込まれそうな予感(汗


さて、タイトルの通り異なるクラスのイベントを一カ所にまとめたい。具体的なコードはこんな感じ。

【このように書きたい】

Private WithEvents mcInspection(2) As Object

Private Sub Initialize()
  Dim i As Integer

  'インスタンス生成
  Set mcInspection(0) = New cCheckVersion
  Set mcInspection(1) = New cCheckDIPSW
  Set mcInspection(2) = New cClearROM

  '処理実行
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Call mcInspection(i).DoInspection()
  Next i

  'インスタンス破棄
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Set mcInspection(i) = Nothing
  Next i
End Sub

Privete Sub mcInspection_Notify(ByVal Index As Integer, ByVal strID As String, ByVal lngCode As Long)
End Sub



Private Const MyName As String = "CheckVersion"
Public Event Notify(ByVal strID As String, ByVal lngCode As Long)

Public Sub DoInspection()
  '処理実行
  'エラーが発生したら
  RaiseEvent Notify(MyName, lngErrorCode)
End Sub

以下cCheckDIPSWもcClearROMも同じ。

だがしかし。これって怒られるのだ。

Private WithEvents mcInspection(2) As Object

もうこの時点でアウト。で、オブジェクト型の配列だからダメなのかと思ってインターフェースを使ってアーリーバインドするように書いてみた。

【インターフェース使ってこんな風に書きたい】

Public Event Notify(ByVal strID As String, ByVal lngCode As Long)

Public Sub DoInspection()
End Sub



Implements IBase
Private Const MyName As String = "CheckVersion"

Public Sub IBase_DoInspection()
  '処理実行
  'エラーが発生したら
  RaiseEvent IBase_Notify(MyName, lngErrorCode)
End Sub



Private WithEvents mcInspection(2) As IBase

Private Sub Initialize()
  Dim i As Integer

  'インスタンス生成
  Set mcInspection(0) = New cCheckVersion
  Set mcInspection(1) = New cCheckDIPSW
  Set mcInspection(2) = New cClearROM

  '処理実行
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Call mcInspection(i).DoInspection()
  Next i

  'インスタンス破棄
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Set mcInspection(i) = Nothing
  Next i
End Sub

Privete Sub mcInspection_Notify(ByVal Index As Integer, ByVal strID As String, ByVal lngCode As Long)
End Sub

だがこれも許されないorz
仕方が無いので今は暫定的に*1こんな面倒な仕組みにしている・・・。

【現状】

'子クラスから呼び出し元の親クラスにイベント通知するためのクラス
Public Event Notify(ByVal strID As String, ByVal lngCode As Long)

Public Sub Notify(ByVal strID As String, ByVal lngCode As Long)
  RaiseEvent Notify(strID, lngCode)
End Sub



Private WithEvents mcNotify(ByVal strID As String, ByVal lngCode As Long)
Private mcInspection(2) As Object

Private Sub Initialize()
  Dim i As Integer

  'インスタンス生成
  Set mcNotify = New cNotify
  Set mcInspection(0) = New cCheckVersion
  Set mcInspection(1) = New cCheckDIPSW
  Set mcInspection(2) = New cClearROM

  '初期化処理
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Call mcInspection(i).Initialize(mcNotify)
  Next i

  '処理実行
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Call mcInspection(i).DoInspection()
  Next i

  'インスタンス破棄
  For i = LBound(mcInspection()) To UBound(mcInspection())
    Set mcInspection(i) = Nothing
  Next i
End Sub

Privete Sub mcNotify_Notify(ByVal strID As String, ByVal lngCode As Long)
End Sub



Private Const MyName As String = "CheckVersion"
Private mcNotify As cNotify

Public Sub Initialize(ByVal cNo As cNotify)
  Set mcNotify = cNo
End Sub

Public Sub DoInspection()
  '処理実行
  'エラーが発生したら
  Call mcNotify.Notify(MyName, lngErrorCode)
End Sub

これで取り敢えずは目的は達成しているのでいいんだけど実際は各子クラスのInisitalize()の引数が結構たくさんあるのでどんどんエレガントなソースからはかけ離れていってしまってなんとかしたいかなと。


どなたか何かエレガントな解決策をお持ちの方がおられましたら是非コメント下さい m(_ _)m

*1:暫定的というかこれしか思いつかなかったんだが