Ereignisse im Eigenbau

Ereignisse werden durch Formulare, Berichte und deren Steuerelemente ausgelöst und vielleicht noch durch einige Objekte, deren Ereignisse man sich auch noch extra per WithEvents-Anweisung gefügig machen muss. Oder gibt es da noch mehr Ja, gibt es! Sie können nämlich eigene Ereignisse samt Ereignisprozedur und Parameter definieren und festlegen, wann diese ausgelöst werden. Wie das geht und was Sie davon haben, erfahren Sie in diesem Beitrag.

Eigene Ereignisse programmieren … als ob die Menge der Ereignisse etwa von Formularen nicht schon unübersichtlich genug wäre! Und damit kann man doch alles machen, was nötig ist, oder nicht Nun: Sie können schon eine Menge mit den eingebauten Ereignissen erledigen, aber fehlte Ihnen da noch nie etwas

Bevor wir zu einem handfesten Beispiel für das Erweitern eines Formulars um ein benutzerdefiniertes Ereignis kommen, schauen wir uns die grundlegende Technik einmal an, und zwar am Beispiel einer Klasse, die von einem Formular referenziert und verwendet wird.

Die Klasse soll irgendetwas unheimlich Spannendes und Aufwendiges tun, was wir in diesem Beitrag aber gar nicht unbedingt komplett beleuchten müssen – zum Beispiel eine E-Mail versenden, deren Daten der Klasse zuvor zugewiesen wurden. Die Klasse enthält zunächst einige Eigenschaften, die für den Versand einer Mail wichtig sind:

Dim m_Empfaenger As String
Dim m_Absender As String
Dim m_Betreff As String
Dim m_Inhalt As String

Diese Eigenschaften macht die Klasse nach außen über eine Public Property verfügbar – hier etwa für die Eigenschaft Empfaenger:

Public Property Let Empfaenger(strEmpfaenger
As String)
m_Empfaenger = strEmpfaenger
End Property

Das ist alles noch nichts Neues – auch nicht die Methode Senden, mit der man den Versand der E-Mail durchführen kann und die hier um die eigentliche Funktion erleichtert wurde:

Public Sub Senden()
€Versendet die E-Mail ...
€ ... viele Befehle ...
€Ruft benutzerdefiniertes Ereignis auf:
RaiseEvent MailVersendet
End Sub

Interessant wird es bei der Zeile RaiseEvent MailVersendet. RaiseEvent sorgt dafür, dass das als Parameter angegebene Ereignis ausgelöst wird. Dieses müssen Sie vorher allerdings noch deklarieren, und zwar im Modulkopf:

Public Event MailVersendet()

Dies ist die denkbar einfachste Variante einer Ereignisdefinition – das nackte Ereignis enthält keinerlei Parameter.

Wenn Sie im VBA-Editor zunächst das Ereignis mit dem Schlüsselwort Events deklarieren, können Sie später nach der Eingabe des Befehls RaiseEvents per IntelliSense darauf zugreifen (siehe Bild 1).

pic002.png

Bild 1: Auf benutzerdefinierte Ereignisse können Sie im gleichen Modul per IntelliSense zugreifen.

Wenn Sie nun ein Formular wie das aus Bild 2 verwenden, können Sie darüber ein Objekt auf Basis der Klasse clsMail instanzieren, mit den benötigten Daten füttern und die Mail absenden. Ach, und natürlich können Sie auf das Ereignis reagieren, das beim Absenden der Mail ausgelöst wird. Dies geschieht in drei Schritten:

pic001.png

Bild 2: Dieses Formular reagiert auf das benutzerdefinierte Ereignis der Klasse clsMail.

Zunächst einmal müssen Sie eine Objektvariable für die Klasse clsMail deklarieren. Dabei verwenden Sie das Schlüsselwort WithEvents, welches es ermöglicht, dass Sie auf die Ereignisse der Klasse reagieren können:

Dim WithEvents objMail As clsMail

Dann instanzieren Sie die Klasse und weisen dieser die Werte aus den Textfeldern des Formulars zu:

Private Sub cmdSenden_Click()
Set objMail = New clsMail
With objMail
.Absender = Me.txtAbsender
.Empfaenger = Me.txtEmpfaenger
.Betreff = Me.txtBetreff
.Inhalt = Me.txtInhalt
.Senden
End With
End Sub

Schließlich fehlt noch die Definition der Ereignisprozedur, welche die Anweisungen enthält, die beim Auslösen des Ereignisses ausgeführt werden sollen.

Dieses Ereignis legen Sie über die beiden Kombinationsfelder des VBA-Fensters der Formularklasse an, indem Sie zunächst links den Eintrag objMail und dann rechts MailVersendet auswählen (siehe Bild 3). Die Routine versehen Sie mit einer einfachen MsgBox-Anweisung:

pic003.png

Bild 3: Anlegen einer Ereignisprozedur für ein benutzerdefiniertes Ereignis

Private Sub objMail_MailVersendet()
MsgBox "Die Mail wurde versendet.€
End Sub

Wenn Sie nun das Formular in der Formularansicht öffnen und auf die Schaltfläche Senden klicken, wird ein Objekt auf Basis der Klasse clsMail instanziert, gefüllt und seine Methode Senden aufgerufen. Dies führt wiederum zum Auslösen des Ereignisses MailVersendet, was im Formular das Anzeigen des gewünschten Meldungsfensters nach sich zieht.

Alternativen und was ihnen fehlt

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