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!

16.1.1 Formulare zur Datenbearbeitung

16.1.2 Codeauslagerung am Beispiel der OK-Schaltfläche

Die OK-Schaltfläche ist ein einfaches Beispiel für die nachfolgend vorgestellte Technik. Sie enthält in der Regel nur eine einzige Anweisung. Das folgende Listing zeigt, wie die Ereignisprozedur aussieht, die beim Klicken auf diese Schaltfläche ausgelöst wird:

Private Sub cmdOK_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Listing 16.1: Prozedur zum Schließen eines Formulars

Es kostet zwar nicht viel Mühe, diese Ereignisprozedur zu erstellen und die einzige Zeile hinzuzufügen. Aber wenn Sie in einer Anwendung einige dieser Prozeduren anlegen, kostet das schon Zeit - und diese Prozedur ist nicht die einzige, die Sie benötigen.

Versuchen Sie also, einen einfacheren Weg zu finden. Ein erster Ansatz wäre, eine öffentliche Prozedur in einem Standardmodul unterzubringen und diese von der Ereigniseigenschaft cmdOK_Click aus aufzurufen. Sie könnte dann auch von den entsprechenden Prozeduren anderer Formulare aus aufgerufen werden.

Gewonnen haben Sie damit allerdings nichts - Sie ersetzen einfach nur die eigentliche Anweisung durch eine, die eine weitere Prozedur aufruft. Das mag ein bisschen Zeit sparen, wenn die eigentliche Prozedur mehrere Zeilen enthält, bringt aber keine wirklichen Vorteile. Gegebenenfalls müssen Sie den Prozeduraufruf auch noch parametrisieren - etwa wenn es um den Code für das Kombinationsfeld geht, der je nach Datensatzquelle des Formulars anders aussieht. Allein die Idee, die Funktion der Prozedur zentral verfügbar zu machen, fließt in die folgenden Schritte ein.

In Kapitel 15, »Objektorientierte Programmierung«, haben Sie erfahren, wie Sie Ereignisse abfangen und eigenen Code dafür ausführen lassen können. Diese Technik machen Sie sich nun zu Nutze. Ziel ist also - am konkreten Beispiel der OK-Schaltfläche betrachtet - das Ereignis Beim Klicken der Schaltfläche abzufangen und bei dessen Aufruf eigenen Code auszuführen, der an völlig anderer Stelle steht. Um die Ereignisse der Schaltfläche abzufangen, benötigen Sie eine Objektvariable, die Sie mit folgender Zeile deklarieren:

Private WithEvents mOkButton As CommandButton

Diese Anweisung fügen Sie in ein neues Klassenmodul namens clsFormCode ein. Damit das hier deklarierte Objekt die Ereignisse der Schaltfläche abfangen kann, muss es zunächst einmal existieren - und dazu ist eine Instanz der Klasse erforderlich, in der es deklariert wird.

Wo erwecken Sie das Klassenmodul nun zum Leben? Natürlich in dem Formular, dessen Ereignisse es abfangen soll. Und dabei übergeben Sie möglichst auch noch je eine Objektvariable, die auf das Formular und die betroffene Schaltfläche zeigt. Der günstigste Zeitpunkt für diese Aktion ist das Öffnen des Formulars. Im folgenden Listing finden Sie das komplette Klassenmodul des Formulars frmKontakte. Die Objektvariable objFormCode wird modulweit deklariert, da sie für die komplette Lebensdauer dieser Formularinstanz benötigt wird.

Die Ereignisprozedur Form_Open wird beim Öffnen des Formulars ausgelöst. Die bisher einzige Prozedur weist der Objektvariablen objFormCode eine neue Instanz der Klasse clsFormCode zu.

Option Compare Database
Option Explicit

'Deklarieren der Objektvariablen für die Codeklasse
Dim objFormCode As clsFormCode

Private Sub Form_Open(Cancel As Integer)
    'Instanzieren des Codeklasse-Objekts
    Set objFormCode = New clsFormCode
End Sub

Listing 16.2: Instanzieren und vorbereiten der Codeklasse

Das Formular erstellt nun beim Öffnen ein Objekt, das auf Ereignisse eines CommandButton-Objekts lauschen soll. Damit das auch funktioniert, müssen Sie dem Objekt einen Verweis auf diese Schaltfläche übergeben - den die Klasse wiederum entgegennehmen muss. Daher fügen Sie dem Klassenmodul clsFormCode eine Property Set-Prozedur hinzu, um den schreibenden Zugriff auf die bereits deklarierte Objektvariable mOkButton zu erlauben:

Public Property Set OkButton(cmb As CommandButton)
    Set mOkButton = cmb
End Property

Listing 16.3: Property Set-Prozedur für die Membervariable mOKButton

Im gleichen Zuge erweitern Sie die Ereignisprozedur Form_Open des Formulars. Die neue Anweisung erzeugt einen Verweis auf die Schaltfläche cmdOK.

Private Sub Form_Open(Cancel As Integer)

    'Instanzieren des Codeklasse-Objekts
    Set objFormCode = New clsFormCode

    'Zuweisen der OK-Schaltfläche
    Set objFormCode.OkButton = Me!cmdOK

End Sub

Listing 16.4: Zuweisen der OK-Schaltfläche an die entsprechende Eigenschaft der Klasse clsFormCode

In der Klasse clsFormCode fehlt nun noch die Prozedur, die beim Abfangen des Beim Klicken-Ereignisses der Schaltfläche ausgeführt werden soll. Um schnell den Prozedurrumpf anzulegen, wählen Sie aus dem linken Kombinationsfeld des Codefensters den Eintrag OKButton aus, woraufhin der Prozedurrumpf automatisch erscheint.

Anschließend brauchen Sie nur noch eine Zeile zum Testen hinzuzufügen - etwa eine MsgBox-Anweisung:

Private Sub mOKButton_Click()
    MsgBox "Ereignis abgefangen"
End Sub

Listing 16.5: Prozedur zum Abfangen des Click-Ereignisses

Wenn Sie das Formular nun öffnen und auf die OK-Schaltfläche klicken, sollte eigentlich das Meldungsfenster erscheinen - es lässt sich aber nicht blicken! Bei genauer Betrachtung des Eigenschaftsfensters der Schaltfläche fällt auf, dass das auch gar nicht funktionieren kann, denn die Schaltfläche löst gar kein Ereignis aus (siehe Abbildung 16.2).

Wählen Sie also für die Eigenschaft Beim Klicken den Eintrag [Ereignisprozedur] aus, öffnen Sie das Formular erneut und klicken Sie noch einmal auf die OK-Schaltfläche - und das Meldungsfenster erscheint.

Zum Glück lässt sich auch dieser Vorgang automatisieren. Dazu passen Sie erneut das Klassenmodul clsFormCode an, indem Sie der Property Set-Prozedur OkButton eine Zeile wie folgt hinzufügen:

Abbildung 16.2: Die OK-Schaltfläche löst offensichtlich kein Ereignis aus

Public Property Set OkButton(cmb As CommandButton)

    'Objektvariable auf Ok-Schaltfläche einstellen
    Set mOkButton = cmb

    'Beim Klicken-Ereigniseigenschaft hinzufügen
    mOkButton.OnClick = "[Event Procedure]"

End Property

Listing 16.6: Anpassen der Property Set-Prozedur OKButton

Die Beim Klicken-Eigenschaft der Schaltfläche im Formular können Sie wieder leeren, da sie später ohnehin automatisch eingestellt wird. Fügen Sie nun die eigentliche Funktion hinzu - schließlich soll die Schaltfläche das Formular schließen und kein Meldungsfenster anzeigen. Dazu sind insgesamt vier Schritte erforderlich:

  • Erstellen einer Objektvariablen namens mForm für das betroffene Formular im Klassenmodul clsFormCode
  • Anlegen einer Property Set-Prozedur zum Setzen der Objektvariablen mForm (ebenfalls im Klassenmodul clsFormCode)
  • Setzen der Objektvariablen auf das aktuelle Formular (vom Beim Öffnen-Ereignis des Formulars aus)
  • Anpassen der Ereignisprozedur im Klassenmodul clsFormCode
  • Das Klassenmodul clsFormCode sieht anschließend wie folgt aus (geänderte Zeilen fett gedruckt):

    Option Compare Database
    Option Explicit

    Private WithEvents mOkButton As CommandButton
    Private WithEvents mForm As Form

    Public Property Set OkButton(cmb As CommandButton)

        'Objektvariable auf Ok-Schaltfläche einstellen
        Set mOkButton = cmb

        'Beim Klicken-Ereigniseigenschaft hinzufügen
        mOkButton.OnClick = "[Event Procedure]"

    End Property

    Private Sub mOKButton_Click()
        'Schließen des Formulars
        DoCmd.Close acForm, mForm.Name
    End Sub

    Public Property Set ThisForm(frm As Form)
        'mForm auf das mit frm referenzierte Formular setzen
        Set mForm = frm
    End Property

    Listing 16.7: Diese Version des Klassenmoduls fängt das Beim Schließen-Ereignis des instanzierenden Formulars ab und führt den entsprechenden Code aus

    Das Formular-Klassenmodul hat nun diesen Stand:

    Option Compare Database
    Option Explicit

    'Deklarieren der Objektvariablen für die Codeklasse
    Dim objFormCode As clsFormCode

    Private Sub Form_Open(Cancel As Integer)

        'Instanzieren des Codeklasse-Objekts
        Set objFormCode = New clsFormCode

        'Zuweisen des aktuellen Formulars
        Set objFormCode.ThisForm = Me

        'Zuweisen der OK-Schaltfläche
        Set objFormCode.OkButton = cmdOK

    End Sub

    Listing 16.8: Das Beim Öffnen-Ereignis instanziert die Klasse clsFormCode und stellt deren Eigenschaften so ein, dass es die Ausführung des Beim Klicken-Ereignisses der OK-Schaltfläche übernimmt

    Lohnt sich der Aufwand?

    Nachdem nun schon für die Erläuterung des Auslagerns einer einzigen Prozedur einige Seiten notwendig waren und die Menge des Codes sich vervielfacht hat, fragen Sie sich vermutlich, ob sich der Aufwand lohnt. Die Antwort lautet ganz klar: Ja! Denn jetzt haben Sie die Vorgehensweise einmal erfasst. Das Erstellen der übrigen Ereignisprozeduren ist reine Fleißarbeit und das Vorbereiten weiterer Formulare für die Verwendung der Klasse clsFormCode nur eine Sache weniger Zeilen.

    Nächster Abschnitt:

    16.1.3 Abbrechen der Bearbeitung auslagern

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.