Tausendsassa Datenblatt - Teil 1

Formularereignisse kapseln


Die oben vorgestellte Methode, die beim Öffnen des Formulars ausgelöst wird, instanziert die Klasse aus Listing 1. Diese Klasse hat nur eine einzige öffentlich schreibbare Eigenschaft namens Formular. Dieser Eigenschaft übergibt die obige Ereignisprozedur lediglich einen Verweis auf das Formular, von dem sie aufgerufen wird. Die Member-Variable der Klasse, der der Verweis auf das Formular zugewiesen wird, ist mit dem Schlüsselword WithEvents deklariert, was bedeutet, dass es auf die Ereignisse des Formulars lauscht und auf diese reagiert, wenn ein entsprechender Ereignishandler angelegt ist. In diesem Fall benötigen Sie dies noch nicht, Sie sollten den Grund der Verwendung des Schlüsselworts WithEvents aber im Hinterkopf behalten.

Eigentlich sollen ja hier auch keine Ereignisse des Formulars, sondern der enthaltenen Steuerelemente gekapselt werden. Und dazu müssen Sie diese Steuerelemente erst einmal durchlaufen und analysieren. Dafür sorgt eine For-Each- Schleife über alle Steuerelemente des Formulars. In dieser Schleife wird überprüft, ob es sich bei dem Steuerelement um ein Textfeld, ein Kombinationsfeld oder ein Kontrollkästchen handelt. Tritt einer dieser Fälle ein, kommt eine weitere Klasse ins Spiel, die ähnlich funktioniert wie die Klasse clsFormular, sich allerdings auf Steuerelemente bezieht: Die aufrufende Klasse clsFormular erzeugt eine Instanz der Klasse clsControl und übergibt der Eigenschaft FormControl einen Verweis auf das aktuell in der For-Each-Schleife befindliche Steuerelement. Dort wird das Steuerelement erneut hinsichtlich seines Typs überprüft und in Abhängigkeit davon einer der drei Membervariablen mTextbox, mComboBox oder mCheckbox zugewiesen.

Diese sind wiederum mit dem Schlüsselwort WithEvents deklariert, was in diesem Fall auch direkt gerechtfertigt ist: Um zu erkennen, was dies bedeutet, wählen Sie im linken Kombinationsfeld im oberen Bereich des Codefensters im VBA-Editor den Eintrag mTextbox aus. Wenn Sie dann das rechte Kombinationsfeld aufklappen, finden Sie dort sämtliche Ereignisprozeduren, die für das Steuerelement auch im Formularmodul zur Verfügung stehen (Bild 2).

Bild 2: Mit WithEvents deklarierte Objekte liefern die ihrem Typ entsprechenden Ereignisprozeduren mit.
Bild 2: Mit WithEvents deklarierte Objekte liefern die ihrem Typ entsprechenden Ereignisprozeduren mit.

Option Compare Database
Option Explicit

Dim WithEvents mTextbox As TextBox
Dim WithEvents mCombobox As ComboBox
Dim WithEvents mCheckbox As CheckBox

Public Property Set FormControl(ctl As Control)
Select Case ctl.ControlType
Case acTextBox
Set mTextbox = ctl
ctl.OnMouseDown = "[Event Procedure]"
Case acComboBox
Set mCombobox = ctl
ctl.OnMouseDown = "[Event Procedure]"
Case acCheckBox
Set mCheckbox = ctl
ctl.OnMouseDown = "[Event Procedure]"
End Select
End Property

Private Sub mCheckbox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Control_MouseDown
End Sub

Private Sub mCombobox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Control_MouseDown
End Sub

Private Sub mTextbox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Control_MouseDown
End Sub

Private Sub Control_MouseDown()
DoCmd.RunCommand acCmdSelectRecord
End Sub

Um in dieser Klasse nun ein Ereignis für eines der Formularsteuerelemente festzulegen, sind zwei Schritte notwendig:

  1. Weisen Sie der Ereigniseigenschaft des
    Steuerelements (hier repräsentiert durch die
    Objektvariable mTextbox, mCombobox oder
    mCheckbox) den Wert [Event Procedure] zu. Dies
    entspricht dem Auswählen des entsprechenden
    Eintrags im Eigenschaftsfenster des Steuerelements.

  2. Fügen Sie zu der Klasse eine Ereignisprozedur
    hinzu, die der soeben festgelegten Ereigniseigenschaft
    entspricht.

Nun werden ja direkt mehrere dieser Steuerelement- Klassen erzeugt – genauso genommen für jedes Textfeld, Kombinationsfeld oder Kontrollkästchen eine. Damit diese nicht vergessen werden, speichert die Formular-Klasse aus Listing 1 die Steuerelement-Klassen in einer Collection, indem es dieser das Steuerelement-Objekt einfach mit der Add-Methode zuweist.

Den in der Steuerelement-Klasse angelegten Ereignisprozeduren müssen Sie nun noch aktivieren: Da alle Steuerelementtypen das Gleiche tun sollen, fügen Sie zu allen Ereignisprozeduren einfach den Aufruf einer weiteren Prozedur namens Control_Mousedown hinzu, in der dann die Anweisung zum Markieren des kompletten Datensatzes aufgerufen wird:

DoCmd.RunCommand acCmdSelectRecord