Thema Datum  Von Nutzer Rating
Antwort
Rot OOP: Event Handling aus Objekt in einer Collection
28.03.2023 08:27:00 Gast85739
NotSolved
28.03.2023 11:01:11 Mase
NotSolved
28.03.2023 11:28:54 Zwenn
NotSolved
28.03.2023 13:34:35 Gast58474
NotSolved
28.03.2023 12:51:41 Gast11171
NotSolved
28.03.2023 13:51:09 Gast42008
NotSolved
28.03.2023 13:28:00 Gast28247
NotSolved

Ansicht des Beitrags:
Von:
Gast85739
Datum:
28.03.2023 08:27:00
Views:
513
Rating: Antwort:
  Ja
Thema:
OOP: Event Handling aus Objekt in einer Collection

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.


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:

 
 

  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot OOP: Event Handling aus Objekt in einer Collection
28.03.2023 08:27:00 Gast85739
NotSolved
28.03.2023 11:01:11 Mase
NotSolved
28.03.2023 11:28:54 Zwenn
NotSolved
28.03.2023 13:34:35 Gast58474
NotSolved
28.03.2023 12:51:41 Gast11171
NotSolved
28.03.2023 13:51:09 Gast42008
NotSolved
28.03.2023 13:28:00 Gast28247
NotSolved