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…).

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar