Home > Artikel > Ausgabe 6/2013 > Ereignisse abgreifen

Ereignisse abgreifen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Normalerweise implementieren Sie die Ereignisprozeduren von Formularen und Steuerelementen jeweils im Klassenmodul des jeweiligen Formulars. Aber wussten Sie, dass Sie die Ereignisse auch in anderen Klassenmodulen implementieren können? Falls nicht: Es funktioniert! Und für diese Technik gibt es auch noch sinnvolle Einsatzzwecke. Wie dies gelingt und welche Einsatzzwecke es dafür gibt, erfahren Sie im vorliegenden Artikel.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1306_EreignisseAbgreifen.mdb.

Ereignisse implementieren

Bestimmte Prozeduren werden durch Ereignisse ausgelöst. Einige haben Sie in Access [basics] bereits kennengelernt – zum Beispiel das Ereignis Beim Klicken einer Schaltfläche oder Formularereignisse wie Beim Öffnen, Beim Anzeigen, Beim Laden oder Beim Entladen eines Formulars.

Diese können Sie nutzen, indem Sie erstens für die Ereigniseigenschaft festlegen, dass das Ereignis eine Ereignisprozedur auslösen soll. Dies erledigen Sie durch Eintragen des Wertes [Ereignisprozedur] für die entsprechende Ereigniseigenschaft.

Zusätzlich benötigen Sie eine Ereignisprozedur, deren erste Zeile eine spezielle, vom Namen des Objekts (also des Formulars oder Steuerelements) und vom Ereignis abhängige Syntax aufweisen muss. Diese sieht etwa für das Laden eines Formulars wie folgt aus:

Private Sub Form_Load()

Die erste Zeile mancher Ereignisprozeduren enthält noch Parameter, die verschiedene Informationen liefern, die beim Durchführen der Prozedur hilfreich sein können. In manchen Fällen nehmen die Parameter auch Rückgabewerte entgegen, mit denen sich das weitere Verhalten von Access steuern lässt.

Einfache Beispiele

Die Konstellation aus Bild 1 liefert ein paar Beispiele für Ereignisprozeduren. Die Schaltfläche cmdForm2­Oeffnen löst die folgende Prozedur aus und öffnet damit das zweite Formular:

Formular 1 öffnet Formular 2, Formular 2 wird wieder geschlossen

Bild 1: Formular 1 öffnet Formular 2, Formular 2 wird wieder geschlossen

Private Sub cmdForm2Oeffnen_Click()

     DoCmd.OpenForm "frm2"

End Sub

Die Schaltfläche cmdForm2­Schliessen im zweiten Formular schließt das Formular wieder und gibt eine Meldung aus, dass Formular 2 geschlossen wird:

Private Sub cmdForm2Schliessen_Click()

DoCmd.Close acForm, Me.Name

MsgBox "Formular 2 wird geschlossen."

End Sub

Formular 1 beim Schließen von Formular 2 informieren

Das ist alles kein Problem, wenn die Formulare unabhängig voneinander sind. Wenn Formular 1 aber nun Werte anzeigt (beispielsweise in einem Unterformular in der Datenblattansicht), die in Formular 2 bearbeitet werden, soll das Unterformular von Formular 1 nach dem Schließen von Formular 2 tunlichst aktualisiert werden, damit es den aktuellen Stand des bearbeiteten Datensatzes anzeigt.

Formular 1 muss also irgendwie informiert werden, wenn der Benutzer Formular 2 schließt. Dies können Sie auf folgende Art erledigen: Dabei öffnet Formular 1 das Formular 2 mit dem Wert acDialog für den Parameter WindowMode. Dies bewirkt, dass Access den aufrufenden Code erst fortsetzt, wenn Formular 2 den Fokus verliert. Dies kann durch zwei Ereignisse geschehen – wenn der Benutzer das Formular schließt oder wenn es nicht mehr sichtbar ist.

Schauen wir uns dies für die Beispielformulare frm1_1 und frm2_1 an. Die Schaltfläche in frm1_1 löst die Ereignisprozedur aus Listing 1 aus. Formular 2 wird dadurch als modaler Dialog geöffnet, die zweite Anweisung der Prozedur wird noch nicht ausgeführt.

Private Sub cmdForm2Oeffnen_Click()

     DoCmd.OpenForm „frm2_1“, WindowMode:=acDialog

     MsgBox „Formular 2 ist geschlossen oder unsichtbar“

End Sub

Listing 1: Formular modal öffnen

Erst wenn der Benutzer Formular 2 schließt, zeigt die Prozedur die Meldung mit dem Text Formular 2 ist geschlossen an.

Der Nachteil bei dieser Vorgehensweise ist, dass der Benutzer erst nach dem Schließen von Formular 2 wieder auf Formular 1 oder andere Formulare zugreifen kann. Das kann aber auch zum Vorteil werden – nämlich dann, wenn das aufrufende Formular die im aufgerufenen Formulare eingegebenen Daten oder Aktionen erwartet.

Ereignisse abgreifen

Es geht aber noch etwas eleganter: Beim folgenden Beispiel ruft die Schaltfläche in Formular 1 wiederum Formular 2 auf, diesmal allerdings nicht im modalen Modus. Als Beispiele dienen die Formulare frm1_2 und frm2_2.

In diesem Beispiel wird auch eine Meldung ausgegeben, wenn das zweite Formulare geschlossen wird – allerdings nicht innerhalb einer Prozedur im Klassenmodul des zweiten Formulars und auch nicht in der Prozedur, die das Formular öffnet.

Stattdessen legen wir eine Ereignisprozedur an, die zwar durch das Ereignis Beim Schließen des zweiten Formulars ausgelöst wird, die sich aber nicht im Klassenmodul des zweiten Formulars befindet – sondern im Klassenmodul des ersten Formulars!

Dazu legen Sie zuerst fest, dass im Klassenmodul des ersten Formulars die Ereignisse des zweiten Formulars abgefangen werden sollen. Dies erledigen Sie durch die Deklaration einer Objektvariablen des Typs Form:

Dim WithEvents frm As Form

Sie erkennen sicher schon die Besonderheit gegenüber anderen Deklarationszeilen. Die Zeile enthält nämlich das Schlüsselwort With­Events. Dieses gibt an, dass Access beim Feuern von Ereignissen in dem mit der Objektvariablen frm referenzierten Formular das aktuelle Klassenmodul nach eventuellen Implementierungen der Ereignisse in Form von Ereignisprozeduren suchen soll.

An welcher Stelle aber füllen wir diese Objektvariable mit dem Verweis auf das Formular frm2_2? Die Voraussetzung dafür ist, dass dieses Formular bereits geöffnet ist. Der beste Zeitpunkt ist also der direkt nach dem Öffnen des Formulars. Da wir dies per VBA-Code erledigen, ist der richtige Code zum Referenzieren des Formulars also schnell gefunden:

Private Sub cmdForm2Oeffnen_Click()

     DoCmd.OpenForm "frm2_2"

     Set frm = Forms!frm2_2

     ...

End Sub

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!