異なるクラスのイベントをまとめたい。
環境:VB6SP6/XP
こんなところに書かずにVisual Basic 初心者掲示板に書き込めと突っ込まれそうな予感(汗
さて、タイトルの通り異なるクラスのイベントを一カ所にまとめたい。具体的なコードはこんな感じ。
【このように書きたい】
Private WithEvents mcInspection(2) As ObjectPrivate 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 SubPrivete 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 IBasePrivate 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 SubPrivete 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 ObjectPrivate 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 SubPrivete Sub mcNotify_Notify(ByVal strID As String, ByVal lngCode As Long)
End Sub
Private Const MyName As String = "CheckVersion"
Private mcNotify As cNotifyPublic Sub Initialize(ByVal cNo As cNotify)
Set mcNotify = cNo
End SubPublic Sub DoInspection()
'処理実行
'エラーが発生したら
Call mcNotify.Notify(MyName, lngErrorCode)
End Sub
これで取り敢えずは目的は達成しているのでいいんだけど実際は各子クラスのInisitalize()の引数が結構たくさんあるのでどんどんエレガントなソースからはかけ離れていってしまってなんとかしたいかなと。
どなたか何かエレガントな解決策をお持ちの方がおられましたら是非コメント下さい m(_ _)m
*1:暫定的というかこれしか思いつかなかったんだが