|
Ohne in der Dokumentation erwähnt zu werden, wird mit Visual Basic ein interessantes und nützliches Werkzeug mitgeliefert: Die "TypeLib Information"-Komponente. Mit Hilfe dieser Komponente können Sie zur Laufzeit eines Programms einiges über Objekte in Erfahrung bringen - wie zum Beispiel ob ein instanziertes Objekt über eine namentlich bekannte Methode oder Eigenschaft verfügt.
Die besagte Komponente steckt in der TlbInf32.DLL im System-Ordner (Fügen Sie Ihrem Projekt einen Verweis auf diese Komponente hinzu). Eine ausführliche Dokumentation dazu hat Microsoft nachträglich zur Verfügung gestellt - Sie können sie im Visual Basic-Update-Bereich von Microsoft herunterladen ( TlbInfHT.exe).
Nach dem Studium der Objekte und Möglichkeiten dieser Komponente (im Objekt-Katalog und in der Dokumentation) werden Sie wahrscheinlich auf mehrere Möglichkeiten stoßen, die Frage nach der Verfügbarkeit einer Methode oder einer Eigenschaft bei einem Objekt zu ermitteln. Die offensichtlichen Möglichkeiten, etwa das Durchlaufen der "Members" eines zu einem Objekt ermittelten TypeInfo-Objekts in einer Schleife, haben jedoch ein paar kleine Nachteile. Zum einen kosten Schleifen immer Zeit - je weiter "hinten" das gesuchte Element steht, um so mehr Zeit. Zum anderen versagen diese Möglichkeiten bei VB-internen Objekten (wie Forms oder VB-eigene Steuerelemente), da diese zur Laufzeit nicht die notwendige COM-konformen Schnittstelle bereitstellen.
Die Methode InvokeID des TLI-Objekts (es ist das globale Stamm-Objekt der Komponente, das nicht instanziert zu werden braucht) braucht jedoch diese Schnittstelle nicht. Sie ermittelt anscheinend auf anderem Wege, ob eine Methode oder Eigenschaft eines Objekts verfügbar ist. Da wir die von InvokeID tatsächlich ermittelte ID gar nicht brauchen, können wir uns mit der reinen Feststellung begnügen, dass eine ID gefunden werden konnte - oder eben nicht gefunden werden konnte. Den in letzterem Fall auftretenden Fehler fangen wir einfach mit einem "On Error Resume Next" ab - und die Negation der Konvertierung der Fehlernummer in einen einfachen Wahrheitswert liefert uns schließlich die gewünschte Information:
Public Function MemberExists(Object As Object, Member As String) _
As Boolean
On Error Resume Next
TLI.InvokeID Object, Member
MemberExists = Not CBool(Err.Number)
End Function
|