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.