Home > Artikel > Ausgabe 4/2012 > Ereignisse in Formularen, Teil 1: Reihenfolge

Ereignisse in Formularen, Teil 1: Reihenfolge

  PDF ansehen

  Download PDF und Beispieldatenbank

Wenn Sie Formulare automatisieren möchten, um beispielsweise beim Öffnen, beim Schließen, beim Wechseln oder Speichern eines Datensatzes selbst programmierte Aktionen durchzuführen, sollten Sie die wichtigsten Ereignisse von Formularen und deren Abfolge kennen. Dieser Artikel zeigt, wie Sie die Reihenfolge der Ereignisse beim Öffnen und Schließen von einfachen Formularen, Formularen mit Unterformularen und gebundenen Formularen ermitteln.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1204_EreignisseInFormularen.mdb.

Ereignisse anlegen

In einigen Artikeln haben Sie bereits erfahren, wie Sie schnell ein Ereignis für ein Formular oder ein Steuerelement anlegen. Dabei öffnen Sie das Formular in der Entwurfsansicht, zeigen die Seite Ereignisse des Eigenschaftsfensters an, wählen für die gewünschte Ereigniseigenschaft den Wert [Ereignisprozedur] aus und klicken dann auf die Schaltfläche mit den drei Punkten (siehe Bild 1). Access erstellt den Rahmen der Ereignisprozedur dann automatisch und zeigt diesen im VBA-Fenster an.

Anlegen von Ereignissen von der Benutzeroberfläche aus

Bild 1: Anlegen von Ereignissen von der Benutzeroberfläche aus

Es gibt jedoch noch eine einfachere Methode. Dazu müssen Sie zumindest das Klassenmodul für das entsprechende Formular angelegt haben, was Sie entweder durch Erstellen einer Ereignisprozedur auf klassischem Wege durchführen – oder Sie stellen einfach die Eigenschaft Enthält Modul im Eigenschaftsfenster auf Ja ein. Access legt dann ein leeres Klassenmodul für das Formular an.

Wenn Sie nun beispielsweise mit der Tastenkombination Alt + F11 zum VBA-Editor wechseln und den Projekt-Explorer mit Strg + R aktivieren, finden Sie dort einen entsprechenden Eintrag vor (siehe Bild 2). Das Klassenmodul öffnen Sie mit einem Doppelklick auf den Eintrag im Projekt-Explorer.

Das Klassenmodul im Projekt-Explorer

Bild 2: Das Klassenmodul im Projekt-Explorer

Wenn Sie nun im Klassenmodul eine Ereignisprozedur für ein Ereignis anlegen möchten, das beispielsweise beim Öffnen des Formulars ausgelöst wird, wählen Sie zunächst den Eintrag Form aus dem linken Kombinationsfeldes des Codefensters aus und dann den Namen des gewünschten Ereignisses aus dem rechten Kombinationsfeld (siehe Bild 3). Dies legt nicht nur die Kopf- und die Fußzeile der Prozedur an, sondern fügt auch den Wert [Ereignisprozedur] in die entsprechende Eigenschaft des Formulars ein. Auf diese Weise können Sie schnell mehrere Ereignisprozedur erstellen. Im Programmiereralltag kommt dies wahrscheinlich nicht allzu oft vor. Wenn Sie aber wie in diesem Artikel den Umgang mit Ereignisprozeduren kennenlernen wollen, kann es helfen, schnell mal ein paar Prozeduren anzulegen.

Anlegen von Ereignisprozeduren per VBA-Editor

Bild 3: Anlegen von Ereignisprozeduren per VBA-Editor

Übrigens funktioniert diese Vorgehensweise zum Anlegen von Prozeduren nicht immer: Wenn Sie etwa ein Formular als modalen Dialog öffnen (also mit DoCmd.OpenForm "Formularname", WindowMode:=acDialog), können Sie wegen des Öffnungsmodus zunächst gar keine Änderungen am Code vornehmen. Klicken Sie dann auf die Zurücksetzen-Schaltfläche (die mit dem Stop-Symbol), können Sie den Code bearbeiten. Das Hinzufügen einer Ereignisprozedur über die beiden Kombinationsfeld oben im Codefenster legt dann allerdings nicht automatisch den Wert [Ereignisprozedur] für die entsprechende Ereigniseigenschaft an.

Ereignisabfolge

Bevor wir uns die einzelnen Ereignisse ansehen, lernen Sie eine wichtige Technik kennen, um die Abfolge von Ereignissen zu ermitteln und um zu prüfen, ob ein Ereignis überhaupt in einem bestimmten Zusammenhang ausgelöst wird. Dazu könnten Sie zunächst einige Ereignisprozeduren zum Formular hinzufügen, die den Eindruck erwecken, dass sie beim schlichten Öffnen und Schließen des Formulars ausgelöst werden.

Aber wissen Sie was: Wir gehen auf Nummer sicher und legen gleich Ereignisprozeduren für alle Ereignisse an, um genau zu ermitteln, wann welche Ereignisprozedur ausgelöst wird. Öffnen Sie also das Klassenmodul des betroffenen Formulars und wählen Sie nacheinander alle Einträge des rechten Kombinationsfeldes im Codefenster aus – solange, bis Sie meinen, Sie hätten für jeden Eintrag eine Ereignisprozedur zum Modul hinzugefügt. Um zu prüfen, ob Sie alle erwischt haben, gibt es eine einfachere Methode als den manuellen Abgleich: Setzen Sie einfach für jeden Prozedurkopf einen Haltepunkt. Dies erreichen Sie zum Beispiel auf die folgenden beiden Arten:

  • Klicken Sie auf Höhe des Prozedurkopfes auf den grauen Bereich am linken Rand des Codefensters.
  • Oder setzen Sie einfach die Einfügemarke auf den Prozedurkopf und betätigen Sie die Schaltfläche F9.

Das Ergebnis sieht anschließend etwa wie in Bild 4 aus. Wie aber sollen wir nun besser als zuvor prüfen, ob wir für jedes Ereignis eine Ereignisprozedur angelegt haben? Ganz einfach: Der VBA-Editor hat im Kombinationsfeld der Ereignisse nun alle Einträge markiert, denen Sie einen Haltepunkt hinzugefügt haben (siehe Bild 5).

Haltepunkte zu Ereignisprozeduren hinzufügen

Bild 4: Haltepunkte zu Ereignisprozeduren hinzufügen

Implementierte Ereignisse werden in der Liste gekennzeichnet.

Bild 5: Implementierte Ereignisse werden in der Liste gekennzeichnet.

Den gleichen Effekt erzielen Sie übrigens auch, sobald Sie auch nur eine einzige Zeile in eine Ereignisprozedur einfügen – dazu später mehr.

Ereignisablauf verfolgen

Nun ist es soweit: Sie haben alle Ereignisse angelegt, die ein Formular bietet, und möchten ermitteln, welche Ereignisse beim Öffnen eines Formulars ausgelöst werden und in welcher Reihenfolge. Wenn Sie jeden Ereigniskopf mit einem Haltepunkt ausgestattet haben, schließen Sie das in der Entwurfsansicht geöffnete Formular nun und öffnen es in der Formularansicht. Bevor Sie das Formular überhaupt sehen, zeigt Access den VBA-Editor an und markiert die erste mit einem Haltepunkt versehene Prozedur, in diesem Fall Form_Open (Beim Öffnen). Damit haben wir die erste beim Öffnen eines Formulars ausgelöste Prozedur ermittelt! Klicke Sie nun auf F5, um den Code bis zum Erreichen des nächsten Haltepunktes weiterlaufen zu lassen. Auf diese Weise erfahren Sie sehr anschaulich, welche Ereignisse beim Öffnen eines Formulars ausgelöst werden (siehe Bild 6).

Der Haltepunkt sorgt für einen Stop beim Erreichen der betroffenen Prozedurzeile.

Bild 6: Der Haltepunkt sorgt für einen Stop beim Erreichen der betroffenen Prozedurzeile.

Nun wollen Sie sich die Reihenfolge vermutlich nicht während des Durchlaufens aufschreiben. Daher wählen wir eine etwas praktischere Methode: Wir fügen einfach für jede Ereignisprozedur eine Debug.Print-Anweisung ein, die den Namen der ausgeführten Ereignisprozedur im Direktfenster des VBA-Editors ausgibt (siehe Bild 7).

Vorbereitung der Ausgabe des Prozedurnamens für alle aufgerufenen Prozeduren im Direktfenster

Bild 7: Vorbereitung der Ausgabe des Prozedurnamens für alle aufgerufenen Prozeduren im Direktfenster

Damit erhalten Sie im Direktfenster schnell einen Überblick über die beim Öffnen eines Formulars ausgelösten Ereignisprozeduren (siehe Bild 8). Das Ereignis Form_KeyDown wird übrigens nur ausgelöst, wenn Sie das Formular durch einen Doppelklick auf den Eintrag im Datenbankfenster öffnen. Wenn Sie es mit der DoCmd.OpenForm-Methode anzeigen, fällt dieses Ereignis aus.

Diese Ereignisprozeduren werden beim Öffnen eines Formulars ausgelöst.

Bild 8: Diese Ereignisprozeduren werden beim Öffnen eines Formulars ausgelöst.

Noch einen Unterschied erhalten Sie, wenn das Formular bereits ein Steuerelement enthält, das den Fokus erhalten kann:

  • Form_Open
  • Form_Load
  • Form_Resize
  • Form_Activate
  • Form_Current
  • txtText_Enter
  • txtText_GotFocus

Das Ereignis Form_GotFocus fällt weg, dafür kommen zwei Ereignisse des Steuerelements, hier eines Textfeldes, hinzu.

Noch komplizierter wird es, wenn das Formular ein Unterformular enthält. Dann sieht die Abfolge so aus (zur Unterscheidung zwischen den Ereignissen von Haupt- und Unterformular haben wir beim Unterformular statt Form... den Bezeichner Subform... verwendet – außerdem wurden mit dem Präfix Subform_Control auch noch die beiden Ereignisse berücksichtigt, die das Unterformular-Steuerelement auslöst):

  • Subform_Open
  • Subform_Load
  • Subform_Resize
  • Subform_Current
  • Form_Open
  • Form_Load
  • Form_Resize
  • Form_Activate
  • Form_Current
  • Subform_Control_Enter
  • Subform_GotFocus

Hier wird also erst das Unterformular geladen und vorbereitet, dann das Hauptformular – uns schließlich wird der Fokus auf das Unterformular gelegt (in diesem Fall, weil dieses ein Steuerelement enthält).

Ereignisse beim Schließen eines Formulars

Natürlich werden auch beim Schließen des Formulars einige Ereignisse ausgelöst. Zunächst die Variante ohne Steuerelement:

  • Form_Unload
  • Form_LostFocus
  • Form_Deactivate
  • Form_Close

Enthält das Formular ein Textfeld, werden diese Ereignisse ausgelöst:

  • txtText_Exit
  • txtText_LostFocus
  • Form_Unload
  • Form_Deactivate
  • Form_Close

Auch hier fällt das LostFocus-Ereignis des Formulars weg, dafür verliert das Steuerelement den Fokus. Fehlt noch der Ablauf beim Schließen eines Formulars samt Unterformular und Unterformular-Steuerelement:

  • Subform_Control_Exit
  • Form_Unload
  • Form_Deactivate
  • Form_Close
  • Subform_Unload
  • Subform_Close

Zusammenfassung und Ausblick

Die Kenntnis der Abfolge der Ereignisse beim Öffnen und Schließen eines Formulars sowie bei sonstigen Ereignissen wie dem Speichern eines Datensatzes oder dem Anklicken von Elementen, dem Ausführen von Tastatur-Anschlägen oder dem schlichten Bewegen der Maus mit oder ohne gedrückte Taste ist sehr wichtig, wenn Sie die Automation von Formularen und Steuerelementen beherrschen wollen. Das Thema ist so komplex, dass wir es auf mehrere Artikel aufteilen. In den weiteren Folgen dieser Artikelreihe kümmern wir uns um die Ereignisse und ihre Bedeutigung sowie ihre Möglichkeiten.