PDF ansehen - Access [basics]

Transcription

PDF ansehen - Access [basics]
Access [basics]
Formulare programmieren
Ereignisse in Formularen, Teil 1: Reihenfolge
Ereignisse in Formularen, Teil 1: Reihenfolge
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.
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 ent- Bild 2: Das Klassenmodul im Projekt-Explorer
weder durch Erstellen einer Ereignisprozedur auf klassischem Wege durchführen – oder
Wenn Sie nun beispielsweise mit der TastenkombiSie stellen einfach die Eigenschaft Enthält Modul im
nation Alt + F11 zum VBA-Editor wechseln und den
Eigenschaftsfenster auf Ja ein. Access legt dann ein
Projekt-Explorer mit Strg + R aktivieren, finden Sie
leeres Klassenmodul für das Formular an.
dort einen entsprechenden Eintrag vor (siehe Bild 2).
Das Klassenmodul öffnen Sie mit einem
Doppelklick auf den Eintrag im ProjektExplorer.
Bild 3: Anlegen von Ereignisprozeduren per VBA-Editor
4/2012
Seite 18
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
www.access-basics.de
Access [basics]
Formulare programmieren
Ereignisse in Formularen, Teil 1: Reihenfolge
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.
Ü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ücksetzenSchaltflä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.
Bild 4: Haltepunkte zu Ereignisprozeduren hinzufügen
Ereignisabfolge
Bevor wir uns die einzelnen Ereignisse Bild 5: Haltepunkte zu Ereignisprozeduren hinzufügen
ansehen, lernen Sie eine wichtige Technik kennen, um die Abfolge von Ereignissen zu ermitfach für jeden Prozedurkopf einen Haltepunkt. Dies
teln und um zu prüfen, ob ein Ereignis überhaupt in
erreichen Sie zum Beispiel auf die folgenden beiden
einem bestimmten Zusammenhang ausgelöst wird.
Arten:
Dazu könnten Sie zunächst einige Ereignisprozeduren zum Formular hinzufügen, die den Eindruck er• Klicken Sie auf Höhe des Prozedurkopfes auf den
wecken, dass sie beim schlichten Öffnen und Schliegrauen Bereich am linken Rand des Codefensßen des Formulars ausgelöst werden.
ters.
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 ein-
4/2012
Seite 19
• 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).
www.access-basics.de
Access [basics]
Formulare programmieren
Ereignisse in Formularen, Teil 1: Reihenfolge
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).
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).
Bild 6: Der Haltepunkt sorgt für einen Stop beim Erreichen der betroffenen Prozedurzeile.
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_Key- Bild 8: Diese Ereignisprozeduren werden beim Öffnen eines Formulars
Down wird übrigens nur ausgelöst, wenn ausgelöst.
Sie das Formular durch einen Doppelklick
auf den Eintrag im Datenbankfenster öffnen. Wenn Sie
• Form_Open
es mit der DoCmd.OpenForm-Methode anzeigen, fällt
dieses Ereignis aus.
• Form_Load
Noch einen Unterschied erhalten Sie, wenn das Formular bereits ein Steuerelement enthält, das den Fokus erhalten kann:
4/2012
Seite 20
• Form_Resize
• Form_Activate
www.access-basics.de
Access [basics]
Formulare programmieren
Ereignisse in Formularen, Teil 1: Reihenfolge
• Form_Current
• Form_Unload
• txtText_Enter
• Form_LostFocus
• txtText_GotFocus
• Form_Deactivate
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):
• Form_Close
Enthält das Formular ein Textfeld, werden diese Ereignisse ausgelöst:
• txtText_Exit
• txtText_LostFocus
• Form_Unload
• Form_Deactivate
• Form_Close
• Subform_Open
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 UnterformularSteuerelement:
• Subform_Load
• Subform_Resize
• Subform_Current
• Subform_Control_Exit
• Form_Open
• Form_Unload
• Form_Load
• Form_Deactivate
• Form_Resize
• Form_Close
• Form_Activate
• Subform_Unload
• Form_Current
• Subform_Close
• Subform_Control_Enter
Zusammenfassung und Ausblick
• 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:
4/2012
Seite 21
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.
www.access-basics.de