RSS
StartseiteKnowledge LibraryTop 10Impressum

5.26 Wie kann ich auf implementierte Schnittstellen eines UserControl zugreifen?

VB5/VB6

Von: Thorsten Dörfler

Angenommen Sie haben eine allgemeine Schnittstelle definiert:

'ICommonData.cls
Public Function GetData() As String
End Function

Weiter nehmen wir an dass diese ihrem UserControl implementiert wird:

Implements ICommonData

Private Function ICommonData_GetData() As String
  ICommonData_GetData = "Foo"
End Function

Auf dieses Interface zuzugreifen, respektive die Methode GetData aufzurufen, gestaltet sich nicht so einfach, wie man zunächst annehmen mag. Versuchen Sie Ihr UserControl auf die implementierte Schnittstelle zu casten, sagt Ihnen VB, dass die Typen unverträglich sind:

Dim lValue As String
Dim lData As ICommonData
Set lData = UserControl1 '< Schlägt fehl

lValue = lData.GetData

Hintergrund: VB erweitert automatisch die Schnittstelle eines jeden Controls um den sogenannten VBControlExtender. Über diesen wird bspw. die Tag Eigenschaft bereitgestellt. Bei der Erweiterung wird allerdings nur die Basis-Schnittstelle des UserControl mit den von Ihnen hinzugefügten Eigenschaften, Methoden und Ereignissen berücksichtigt. Implementierte Schnittstellen bleiben außen vor.

In dieser Erklärung, steht auch schon indirekt die Antwort auf die Frage, wie man an die implementierten Schnittstellen herankommt: Über die Basis-Schnittstelle erhält man Zugriff auf die native Schnittstelle des UserControl, inklusive der implementierten Schnittstellen. Die Basis-Schnittstelle wird über die Object-Eigenschaft bereitgestellt:

Dim lValue As String
Dim lData As ICommonData
Set lData = UserControl1.Object

lValue = lData.GetData

Ähnlich müssen Sie vorgehen, wenn Sie eine Referenz vom Typ ICommonData als Methodenargument übergeben möchten. Solange Sie dieses als Wert (ByVal) übergeben, können Sie auf einen expliziten Cast verzichten und direkt UserControl.Object übergeben. Übergeben Sie den Parameter als Referenz (ByRef und Standard, wenn nicht explizit angegeben), müssen Sie zuvor einen Cast, wie oben gezeigt durchführen. Hier würden Sie dann lData übergeben. Da Objektverweise ohnehin als Referenz übergeben werden, besteht allerdings in dem Fall keine Notwendigkeit ByRef zu verwenden.