Schnittstellen und referenzierte Objekte

15/04/2008 - 10:03 von Ralf Schrader | Report spam
Ich habe in einer Applikation mehrere Datenstrukturen und dazu gehörige
Formulare, die den Datenim- und export unterstützen müssen. Den Import bzw.
das Merging möchte ich über ein gemeinsames Formular abwickeln. Deshalb habe
ich den entsprechenden Klassen, welche die Daten repràsentieren eine
Schnittstelle gegeben. Wenn ich dem Formular das Objekt als Referenz via
Schnittstelle übergebe, löst das Objekt im Formular keine Events aus. Ich
sehe auch den Grund,

ObjPtr(Objekt) = 79368064
ObjPtr(Schnittstelle) = 79368352

aber Objekt Is Schnittstelle = True

mit folgendem Code

Private m_App As RSCarePlanningOM.Application
Private m_DataProvider As IDbImExport
Private m_Translator As IMultiLocale
Private WithEvents m_ContactManagement As RSCarePlanningOM.ContactManagement
...

Friend Sub Init(ByRef lApp As RSCarePlanningOM.Application, _
ByRef idbie As IDbImExport, _
Optional ByRef lLocalizer As Localizer = Nothing)
Set m_App = lApp
Set m_DataProvider = idbie
Set m_Translator = lApp.ApplicationControl

If m_DataProvider Is m_App.ContactManagement Then
Set m_ContactManagement = m_App.ContactManagement
ElseIf m_DataProvider Is m_App.DocumentManagement Then
Set m_DocumentManagement = m_App.DocumentManagement
ElseIf m_DataProvider Is lLocalizer.Dictionary Then
Set m_Dictionary = lLocalizer.Dictionary
ElseIf m_DataProvider Is m_App.Localities Then
Set m_localities = m_App.Localities
End If

referenzieren m_DataProvider (Schnittstelle) und m_ContactManagement nicht
das gleiche Objekt. Aber auch wenn ich

Set m_ContactManagement = idbie

setze, kommen keine Events im Formular an.Kann man das irgendwie elegant
lösen?

Ralf
 

Lesen sie die antworten

#1 Schmidt
18/04/2008 - 12:17 | Warnen spam
"Ralf Schrader" schrieb im Newsbeitrag
news:eTB2C%

[Schnittstellen-Implementierung und Events]
Events aus implementierten Schnittstellen zu raisen, funktioniert
in VB nur über das Default-Interface der implementierenden
Klasse.

'Class cDefault
Option Explicit

Public Event From_cDefault()
Public Event From_ISpecial() 'nur per Umweg über cDefault möglich

Implements ISpecial

'******* Public Methoden des Default-Interfaces *******

Public Sub DoSometing_Over_cDefault()
'...
RaiseEvent From_cDefault()
End Sub


'******* Impl. Methoden des "Fremd-Interfaces" *******
Private Sub ISpecial_DoSomething_Over_ISpecial()
'...
RaiseEvent From_ISpecial()
End Sub


'- In der Client-Anwendung --
'.WithEvents oSpecial As ISpecial würde nicht funktionieren
Private WithEvents oDefault As cDefault

'und die entsprechenden Event-Handler
Private Sub oDefault_From_cDefault()
'...
End Sub

Private Sub oDefault_From_ISpecial()
'...
End Sub

Soviel vielleicht erstmal bzgl. des Problems und eine erste,
naive Lösung dazu.

Mittels eines zentral platzierten EventHandler-Objektes (das
man im Objektmodell bekannt macht) kann man dann noch
ein wenig mehr hinbekommen.

Aber vielleicht reicht das ja auch schon so - ansonsten wàre ein
kleines Code-Beispiel sinnvoll (so 2-3 Mini-Klassen mit "nix groß
drin" + ein Client), welches demonstriert bei welcher Konstellation
es im Client mit den Events hakt.

Olaf

Ähnliche fragen