オブジェクトがコレクション内に含まれている場合、そのオブジェクトは引き続きイベントを親クラスに発行できますか?カスタムコレクションクラスのオブジェクトからイベントを呼び出す
明らかに、子クラスに親クラスへの参照を伝えてから、子クラス内の親クラス内でパブリックメソッドを呼び出すことはできますが、循環参照になります。ガベージコレクタはどちらのオブジェクトも削除しませんでした。
詳細: 私は2つのクラス、1つはclsPersonという名前、もう1つはclsPeopleという名前のカスタムコレクションクラスを持っています。 clsPersonには、Selectedという名前のpublic booleanプロパティがあります。選択されている場合は、SelectedChangeイベントを呼び出します。その時点で、私はclsPeopleで何かする必要があります。カスタムコレクションクラスclsPeopleでイベントをトラップするにはどうすればいいですか?人のクラスは人の範囲外から変更することができます。そうでなければ、私は別の解決策を探します。
<<Class clsPerson>>
Private pSelected as boolean
Public Event SelectedChange()
Public Property Let Selected (newVal as boolean)
pSelected = newVal
RaiseEvent SelectedChange
End Property
Public Property Get Selected as boolean
Selected = pSelected
End Property
<<Class clsPeople>>
Private colPeople as Collection
' Item set as default interface by editing vba source code files
Public Property Get Item(Index As Variant) As clsPerson
Set Item = colPeople.Item(Index)
End Property
' New Enum set to -4 to enable for ... each to work
Public Property Get NewEnum() As IUnknown
Set NewEnum = colPeople.[_NewEnum]
End Property
' If selected changes on a person, do something
Public Sub ???_SelectedChange
' Do Stuff
End Sub
このコードは非常に役に立ちました。 VBAでインターフェイスとイベントを一緒に使用するのに役立ちました。投稿していただきありがとうございます! 1)テキスト 'Raise_'は' clsPersonsDelegate'クラスのメソッド名から削除することができます。 2) 'clsPeople'の' colDelegate_SelectedChange'メソッドは、 'clsPerson'型のパラメータを受け入れるように変更する必要があります。また、このコードを試してみる人のために、 'clsPeople'は' Set colPeople = New Collection'と 'Set colDelegate = New clsPersonsDelegate'にinitializeメソッドが必要です。 – BarrettNashville
@BarrettNashville Thx!はい、 'Raise_'接頭辞は必要ではありません、私はちょうどスタイルの問題としてそれを使用します:私はいつも私が参照されていることを知るように別名を保つのが好きです。 – RBarryYoung