Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

15.7.1 Ereignisse abfangen

15.7.2 Eigene Ereignisse anlegen

Genau wie das Webbrowser-Objekt im vorherigen Beispiel können auch benutzerdefinierte Klassen Ereignisse bereitstellen. Benutzerdefinierte Ereignisse bieten die Möglichkeit, von außen auf bestimmte Ereignisse in einer betroffenen Klasse zu »lauschen«. Und das funktioniert folgendermaßen:

  • Sie legen in einer Klasse ein Ereignis fest. Dazu verwenden Sie das Event-Schlüsselwort.
  • Bei Bedarf löst irgendeine Prozedur innerhalb der Klasse dieses Ereignis aus. Dazu ist die RaiseEvent-Anweisung erforderlich.
  • Die Klasse mit dem Ereignis deklarieren Sie in der Klasse, die auf das Eintreten des Ereignisses reagieren soll, mit dem Schlüsselwort WithEvents.
  • Schließlich legen Sie eine entsprechende Ereignisprozedur an.
  • Das folgende Beispiel füllt die Vorgehensweise mit Leben. Dabei spielen zwei Formulare die Hauptrolle: Das erste Formular namens frmKontakte enthält ein Listenfeld zur Auswahl von Kontakten. Per Doppelklick auf das Listenfeld oder mit einem einfachen Klick auf die Schaltfläche soll das Formular frmKontaktDetails geöffnet werden und den ausgewählten Datensatz anzeigen (siehe Abbildung 15.7).

    Abbildung 15.7: Formulare des Beispiels für benutzerdefinierte Ereignisse

    Ziel der Übung ist, dem Detailformular ein Ereignis zu verpassen, das beim Ändern des angezeigten Datensatzes ausgelöst wird. Das aufrufende Formular soll mit einer Ereignisprozedur auf dieses Ereignis reagieren und den Inhalt des Listenfeldes aktualisieren.

    Nun öffnet man Detailformulare in der Regel als modalen Dialog, indem man die OpenForm-Methode des DoCmd-Objekts verwendet und dabei den Parameter WindowMode auf True setzt. Die Ausführung der aufrufenden Prozedur wird dann so lange unterbrochen, bis das aufgerufene Formular entweder unsichtbar gemacht oder geschlossen wird - dann sorgt eine entsprechende Requery-Methode für die Aktualisierung des Inhalts des Listenfeldes. Diese Methode wird auch aufgerufen, wenn der Benutzer den Kontakt-Datensatz nur ansehen möchte und ihn gar nicht ändert - in diesem Fall also völlig unnötig.

    Hinzufügen des Ereignisses

    Der erste Schritt auf dem Weg zur benutzerdefinierten Ereignisbehandlung ist das Anlegen des Ereignisses. Das Ereignis soll Change heißen und es sind keine Parameter notwendig. Dementsprechend sieht die Deklaration des Ereignisses wie folgt aus:

    Public Event Change()

    Auslösen des Ereignisses

    Nachdem Sie das Ereignis angelegt haben, müssen Sie einen Zeitpunkt auswählen, an dem das Ereignis ausgelöst werden soll. Die Ereignisprozedur Nach Aktualisierung des Formulars scheint die richtige Wahl zu sein: Sie wird nur ausgelöst, wenn der Datensatz geändert wurde und deshalb gespeichert werden soll. Legen Sie die Ereignisprozedur an, indem Sie die beiden Kombinationsfelder im Codefenster auf die Einträge Form und AfterUpdate einstellen (siehe Abbildung 15.8) und ergänzen Sie den automatisch angelegten Prozedurrumpf wie folgt:

    Private Sub Form_AfterUpdate()
        'Ereignis auslösen
         RaiseEvent Change
    End Sub

    Listing 15.23: Auslösen eines Ereignisses

    Abbildung 15.8: Anlegen der Ereignisprozedur, die wiederum ein Ereignis auslösen soll

    Auf ein Ereignis reagieren

    Um mit einer Ereignisprozedur auf ein Ereignis zu reagieren, müssen einige Voraussetzungen erfüllt sein:

  • Nur Klassenmodule (einschließlich Formular- und Berichtsmodule) können Ereignisprozeduren implementieren.
  • Die Klasse, die das Ereignis enthält, muss in der Klasse, in der mit einer Ereignisprozedur auf das Ereignis reagiert werden soll, mit dem Schlüsselwort WithEvents in Form einer Objektvariablen deklariert werden:
  • Private WithEvents objKontaktDetail As Form_frmKontaktDetail

  • Die Objektvariable muss auf eine Instanz der Klasse mit dem Ereignis verweisen.
  • Die erste Bedingung ist erfüllt, da die Ereignisprozedur im aufrufenden Formular ausgewertet werden soll. Die für die zweite Bedingung notwendige Codezeile können Sie einfach von dort in das Klassenmodul des Übersichtsformulars übernehmen.

    Ein kleines Problem ist die dritte Bedingung, denn, wie bereits weiter oben erwähnt, öffnet man ein Formular in der Regel mit der DoCmd.OpenForm-Anweisung - gerade, weil dies offensichtlich der einzige Weg ist, ein Formular modal zu öffnen.

    Außerdem lässt sich so bequem eine Where-Bedingung mitgeben:

    DoCmd.OpenForm "frmSchnellsuchePerKombifeld", _
        WhereCondition:="KontaktID = " & Me!lstKontakte, _
        WindowMode:=acDialog

    Das ist aber auch nur die halbe Wahrheit: Formulare stellen eine Eigenschaft namens Modal zur Verfügung, die Sie im Eigenschaftsfenster auf der Registerseite Andere unter dem Namen Gebunden finden.

    Nach der Änderung auf den Wert True lässt sich das Formular ausschließlich im modalen Modus öffnen - aber für dieses Beispiel ist das durchaus in Ordnung. Anschließend speichern und schließen Sie das Formular.

    Nun können Sie auf die DoCmd.OpenForm-Anweisung verzichten, eine neue Instanz des Formulars mit der New-Anweisung erstellen und direkt mit der Objektvariable objKontaktDetail darauf verweisen.

    Die notwendige Where-Bedingung ersetzen Sie durch die Verwendung der beiden Eigenschaften Filter und FilterOn. Erst durch Setzen der Visible-Eigenschaft auf den Wert True wird das Formular sichtbar gemacht - als modaler Dialog.

    Die Voraussetzungen zum Abfangen von Ereignissen des so geöffneten Formulars per Ereignisprozedur wären damit erfüllt.

    Private Sub Anzeigen()

        'Wenn Kontakt ausgewählt
        If Not IsNull(Me!lstKontakte) Then
            'Neues Formular instanzieren
            Set objKontaktDetail = New Form_frmKontaktDetail

            With objKontaktDetail
                'Filter setzen
                .Filter = "KontaktID = " & Me!lstKontakte
                .FilterOn = True
                'Sichtbar machen
                .Visible = True
            End With

         End If

    End Sub

    Listing 15.24: Setzen der Objektvariable auf eine neue Instanz des Formulars frmKontaktDetail

    Nun müssen Sie im aufrufenden Formular nur noch die gewünschte Ereignisprozedur anlegen. Dazu wählen Sie im linken Kombinationsfeld des Codefensters den Eintrag objKontaktDetail aus - der Prozedurrumpf für das einzige zur Verfügung stehende Ereignis wird automatisch angelegt (siehe Abbildung 15.9).

    Abbildung 15.9: Anlegen einer Ereignisprozedur für die benutzerdefinierte Eigenschaft

    Den Prozedurrumpf müssen Sie nun nur noch mit der für die Aktualisierung notwendigen Anweisung füllen:

    Private Sub objKontaktDetail_Change()
        'Listenfeld nach Änderungen im Detailformular aktualisieren
        Me.lstKontakte.Requery
    End Sub

    Listing 15.25: Ereignisprozedur zum Aktualisieren des Listenfeldes

    Nächster Abschnitt:

    15.8 Benutzerdefinierte Auflistungen mit dem Collection-Objekt

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.