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