Standardmethode von Klassen nutzen

Wussten Sie, dass Sie für ein Klassenmodul eine Standardmethode festlegen können Es funktioniert, und eine solche Methode rufen Sie allein durch die Angabe des entsprechenden Objektnamens auf. Wofür man das braucht Na, zum Beispiel, um Ereignisprozeduren für Eigenschaften zu implementieren, bei denen dies normalerweise nicht gelingt. So können Sie nun etwa per Ereignisprozedur auf das vollständige Laden einer Webseite mit dem Webbrowser-Steuerelement reagieren anstatt eine Do-While-Schleife so lange laufen zu lassen, bis der gewünschte Status erreicht wird.

Wenn Sie beispielsweise ein Formular programmieren und einer Schaltfläche auf diesem Formular eine Ereignisprozedur zuweisen möchten, also eine Prozedur, die beim Anklicken der Schaltfläche ausgelöst wird, brauchen Sie dazu nur zwei Schritte: Sie tragen im Eigenschaftsfenster den Wert [Ereignisprozedur] für die Eigenschaft Beim Klicken ein und wechseln dann zum VBA-Editor, um die automatisch erstellte Prozedur mit den gewünschten Codezeilen zu ergänzen.

Wenn Sie die Ereignisse eines Objekts von außen, also beispielsweise von einem Klassenmodul aus abgreifen möchten, deklarieren Sie dieses Objekt mit dem Schlüsselwort WithEvents, also beispielsweise so:

Dim WithEvents objForm as Form

Über die beiden Kombinationsfelder des Codefensters des Klassenmoduls greifen Sie dann auf die Ereignisse des jeweiligen Objekts zu und versehen diese mit entsprechenden Ereignisprozeduren.

Es gibt aber auch Ereignisse, auf die Sie nicht wie gewohnt reagieren können. Ein Beispiel ist das Objekt XMLHTTP der Bibliothek Microsoft XML, v x.0.

Damit können Sie beispielsweise Webseiten oder sogar komplette Dateien aus dem Internet herunterladen, wie der Beitrag Webservice light zeigt (www.access-im-unternehmen.de/798).

Bild 1 liefert einen Einblick in die Member dieser Klasse, wobei onReadyStateChange nach einem Kandidaten für ein Ereignis aussieht, aber eigentlich eine Eigenschaft ist.

pic001.png

Bild 1: Eventhandler der XMLHTTP-Klasse

In diesem Fall wäre eine Ereigniseigenschaft namens onReadyStateChange nützlich, weil man mit einer entsprechenden Ereignisprozedur etwa ermitteln könnte, wann die zu ladende Quelle vollständig ist.

Der Objektkatalog gibt preis, dass Sie dieser Eigenschaft ein Objekt zuweisen können und nicht etwa eine Zeichenkette, um den Namen einer beim Eintreten dieses vermeintlichen Ereignisses auszulösenden Prozedur anzugeben.

Außerdem steht in der Beschreibung noch Register a complete event handler. Was können wir damit anfangen

Klasse mit Standardmethode

Der Eigenschaft onReadyStateChange können Sie ein Objekt auf Basis einer Klasse zuweisen, die über eine Standardmethode verfügt, also eine Methode, die nicht explizit aufgerufen werden muss.

Wahrscheinlich kennen Sie Standardeigenschaften von Objekten: Wenn Sie beispielsweise auf den Inhalt eines Textfelds in einem Formular zugreifen möchten, können Sie dies auf zwei Arten erledigen. Die korrekte Art wäre die folgende:

Debug.Print Me!txtText.Value

Eingebürgert hat sich aber die zweite Variante, die es sich zunutze macht, dass Value die Standardeigenschaft dieses Steuerelements ist und Sie diese nicht extra angeben müssen:

Debug.Print Me!txtText

Auf die gleiche Weise arbeiten verkappte Ereigniseigenschaften wie onReadyStateChange. Dieser können Sie ein Objekt zuweisen, das eine Standardmethode besitzt. Schade nur, dass Sie mit dem VBA-Editor keine Standardmethode für eine Klasse festlegen können!

Zum Glück gibt es die Möglichkeit, dies außerhalb des VBA-Editors zu erledigen, und zwar mit einem Text-Editor.

Wir betrachten die Vorgehensweise zunächst anhand eines einfachen Beispiels. Eine Klasse mit einer Standardmethode soll nach dem Aufruf schlicht ein Meldungsfenster anzeigen. Dazu legen Sie in einer Datenbank eine neue Klasse namens clsDefaultMethod an und fügen dieser lediglich die folgende Prozedur hinzu:

Public Sub DefaultMethod()
    MsgBox "Standardmethode aufgerufen!"
End Sub

Speichern Sie die Klasse. Danach legen Sie ein Standardmodul an und erstellen darin eine Prozedur, welche die Standardmethode der neuen Klasse testen soll. Diese Prozedur sieht wie folgt aus:

Public Sub TestDefaultMethod()
    Dim objDefaultMethod As clsDefaultMethod
    Set objDefaultMethod = New clsDefaultMethod
    objDefaultMethod
End Sub

Wenn Sie die Prozedur TestDefaultMethod aufrufen, löst dies den Fehler Objekt unterstützt diese Eigenschaft oder Methode nicht aus – und zwar wie erwartet.

Wie sollen wir die Methode namens DefaultMethode nun zu einer Standardmethode machen, um diese durch den reinen Aufruf des Objekts auszuführen Dies gelingt in drei Schritten:

  • Speichern Sie die Klasse über den Kontextmenübefehl Datei exportieren… des Eintrags clsDefaultMethode im Objekt-Explorer in einem beliebigen Verzeichnis.
  • Öffnen Sie die Datei in einem Texteditor Ihrer Wahl und fügen Sie die Zeile Attribute DefaultMethod.VB_UserMemId = 0 als erste Zeile der Prozedur DefaultMethod hinzu (s. Bild 2).
  • pic002.png

    Bild 2: Eine Methode zur Standardmethode machen

  • Kehren Sie zum VBA-Editor zurück. Entfernen Sie die Klasse clsDefaultMethode mit dem Kontextmenüeintrag Entfernen von clsDefaultMethod… und importieren Sie die geänderte Fassung (Menüeintrag Datei|Datei importieren…).

Fertig! Wenn Sie die Klasse nun im VBA-Editor betrachten, sieht alles wie zuvor aus (s. Bild 3). Unter der Haube hat sich jedoch einiges getan – dies zeigt sich, wenn Sie die Prozedur TestDefaultMethod nochmals aufrufen.

pic003.png

Bild 3: Im VBA-Editor sind keine änderungen erkennbar.

Nun gelingt der Aufruf der Standardmethode nur durch Angabe des Objektnamens – das Meldungsfenster erscheint!

Ereignis per Standardmethode

Mit dieser Erkenntnis im Gepäck kehren wir zur eigentlichen Aufgabenstellung zurück – dem Auslösen eines Ereignisses, wenn sich der Zustand beim Herunterladen einer Webseite oder einer Datei ändert.

Wir verwenden zunächst eine einfache Variante, bei der die Klasse mit der Ereignisprozedur den Großteil der Arbeit übernimmt. Damit dies gelingt, übergeben wir der Klasse einen Verweis auf das XMLHTTP-Objekt – so kann die Klasse direkt auf die enthaltenen Informationen zugreifen.

Der Prozess beginnt mit dem Aufruf der Prozedur GetWebpageOrFile und der Übergabe der aufzurufenden Adresse:

GetWebpageOrFile "http://www.ebay.de"

Die Prozedur GetWebpageOrFile finden Sie in Listing 1. Die Prozedur erstellt zunächst ein neues XMLHTTP-Objekt und speichert den Verweis darauf in der Variablen objXMLHTTPRequest. Außerdem erzeugt sie eine neue Instanz der Klasse clsXMLHTTPHandler (s. Listing 2).

Listing 1: Herunterladen einer Webseite oder Datei

Public Function GetWebpageOrFile(ByVal strDateiadresse As String) As Long
    Dim objXMLHTTPRequest As MSXML2.XMLHTTP
    Dim objXMLHTTPHandler As clsXMLHTTPHandler
    Set objXMLHTTPRequest = New MSXML2.XMLHTTP
    Set objXMLHTTPHandler = New clsXMLHTTPHandler
    Set objXMLHTTPHandler.XMLHTTPRequest = objXMLHTTPRequest
    With objXMLHTTPRequest
        .OnReadyStateChange = objXMLHTTPHandler
        .Open "GET", strDateiadresse, True
        .send ""
    End With
End Function

Listing 2: Klasse mit Standardmethode

Dim mXMLHttpRequest As MSXML2.XMLHTTP
Public Property Set XMLHTTPRequest(objXMLHTTPRequest As MSXML2.XMLHTTP)
    Set mXMLHttpRequest = objXMLHTTPRequest
End Property
Sub OnReadyStateChangeHandler()
    Debug.Print mXMLHttpRequest.ReadyState
    If mXMLHttpRequest.ReadyState = 4 Then
        If mXMLHttpRequest.status = 200 Then
            Debug.Print "Fertig"
        End If
    End If
End Sub

Damit die Standardmethode dieser Klasse später auf die Informationen des XMLHTTP-Objekts zugreifen kann, übermitteln Sie dieser einen Verweis darauf. Die Klasse clsXMLHTTPHandler bietet dazu eine Property Set-Methode an, die den Verweis in der Member-Variablen mXMLHttpRequest speichert.

Sie enthält außerdem eine Prozedur namens OnReadyStateChangeHandler. Diese wird, wie oben beschrieben, durch die Zeile Attribute DefaultMethod.VB_UserMemId = 0 als Standardmethode der Klasse festgelegt.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar