Ich habe eine Art komplexes Szenario.
Ich habe eine benutzerdefinierte Klasse "clsModule". Es wird viele Instanzen von "clsModule" geben. Jede Instanz kann eine Sammlung anderer „clsModule“-Instanzen haben. Jede „clsModule“-Instanz kann Ereignisse auslösen, die von der „Eltern“-Instanz des Typs „clsModule“ behandelt werden sollten, die die variable Anzahl von untergeordneten „clsModule“-Instanzen in einem Sammlungsobjekt enthält.
Ich verwende Vorschläge dieses großartigen Beitrags.
Das Problem ist, dass Events in VBA nur registriert werden, wenn die Objektvariable in der Behandlungsklasse explizit über "WithEvents" definiert ist. Da die Anzahl der untergeordneten Instanzen von "clsModule" jedoch variabel ist, können diese nicht explizit definiert werden.
Die benutzerdefinierte Klasse „clsModule“ enthält eine Pseudo-Schnittstelle (eher eine Klasse als eine Schnittstelle, aber ich habe die Benennung aus dem obigen Beitrag verwendet), die ein benutzerdefiniertes Ereignis und eine Funktion „benachrichtigen“ enthält.
Jede untergeordnete Instanz von „clsModule“ in der übergeordneten Sammlung „modules“ löst das Ereignis „notify“ korrekt aus, aber ich weiß nicht, wie ich das Ereignis in der übergeordneten Instanz von „clsModule“ behandeln soll.
Irgendwelche Ideen?
Hier ist der Code. Zum besseren Verständnis habe ich nur die relevanten Klassenmitglieder erwähnt.
clsModule:
Option Explicit
Private WithEvents sheet_ As Worksheet
Private Type tThis
events As IModuleEvents 'Pseudo interface; rather a class with I* naming
modules As Collection 'holds variable number of "clsModule" instances
End Type
Private this As tThis
Private Sub Class_Initialize()
Set this.events = New IModuleEvents
End Sub
Public Function constructor(wks as worksheet, _
Optional modules As Collection)
Set sheet_ = wks
Set this.modules = modules
End Function
Private Sub sheet__Change(ByVal target As Range)
notify "changed"
End Sub
Private Function notify(message As String)
this.events.notify Me, message
End Function
IModuleEvents:
Option Explicit
Public Event notify(ByRef module As clsModule, message As String)
Public Function notify(ByRef module As clsModule, message As String)
RaiseEvent notify(module, message)
End Function
Setting it up in Module1 (Standard Module):
Option Explicit
Private source As clsModule
Private target As clsModule
Private Function test()
Set source = New clsModule
source.constructor ActiveWorkbook.Worksheets(1)
Set target = New clsModule
target.constructor ActiveWorkbook.Worksheets(2), _
newCollection(Array(source))
End Function
Private Function newCollection(items) As Collection
Dim v, c As New Collection
For Each v In items
c.add v
Next
Set newCollection = c
End Function
Now, if you change the worksheet of instance "source", the function "notify" is correctly executed. But I do not know how to handle the event.
|