
Bild 1: Navigieren im Datums-Textfeld
Im Beitrag „Datum schnell per Tastatur einstellen“ (www.access-im-unternehmen.de/1590) haben wir eine Lösung vorgestellt, mit der wir allein über die Tasten „Nach oben“, „Nach unten“, „Nach links“ und „Nach rechts“ das Datum in einem Textfeld einstellen können. Diese Lösung haben wir in diesem Beitrag speziell für ein Textfeld programmiert. Noch effizienter wäre die Lösung, wenn wir die Funktionalität in einer Klasse unterbringen, die man mit wenigen Codezeilen schnell zu einem Datums-Textfeld hinzufügen könnte. Genau das erledigen wir im vorliegenden Beitrag.
Die Lösung, die wir im oben genannten Beitrag vorgestellt haben, ermöglicht das einfache Navigieren in einem Datums-Textfeld. Beim Eintritt wird der Tag markiert, mit der Taste Nach rechts springt man zum Monat und zum Jahr und mit den Tasten Nach oben und Nach unten stellt man den aktuell markierten Teil des Datums ein. Mit Nach links kann man zu den vorherigen Datumsteilen zurückspringen. Außerdem können wir bei gedrückter Umschalttaste das Jahr in Zehnerschritten ändern (siehe Bild 1).

Bild 1: Navigieren im Datums-Textfeld
Allerdings umfassen die notwendigen Prozeduren rund 150 Zeilen Code, die man im aktuellen Zustand für jedes Datums-Textfeld erneut anlegen und anpassen müsste. Da es vorkommen kann, dass eine Anwendung viele Textfelder enthält, die alle mit dieser Funktion ausgestattet werden sollen, wäre das erstens eine Menge Arbeit und eine Menge redundanter Code.
Daher haben wir uns entschlossen, die gesamte Funktionalität so in ein Klassenmodul zu übertragen, dass für die Verwendung nur noch wenige Zeilen Code notwendig sind.
Erstellen der Klasse
Den Code der Lösung haben wir in eine neue Klasse namens clsDateBox übertragen. Diese haben wir um zwei privat deklarierte Variablen erweitert:
Private WithEvents m_txt As TextBox Private m_ActivateTabEnter As Boolean
Die erste Variable namens m_txt soll einen Verweis auf das Datums-Textfeld aufnehmen und ist mit dem Schlüsselwort WithEvents deklariert, damit wir für diese Variable Ereignisse innerhalb des Klassenmoduls definieren können.
Die zweite heißt m_ActivateTabEnter und liefert noch eine zusätzliche Funktion, die wir erst im Rahmen dieses Beitrags hinzugefügt haben: Wir können noch eine Eigenschaft namens ActivateTabEnter auf True einstellen.
Dies bewirkt, dass bei Betätigung der Tab– oder der Enter-Taste innerhalb des Datums-Textfeldes der Fokus nicht auf das nächste Steuerelement verschoben wird (oder bei gleichzeitigem Drücken der Umschalt-Taste auf das vorherige), sondern die Markierung im Datums-Textfeld von einem Datumselement zum nächsten bewegt.
Damit wir einen Verweis auf das mit der Funktion auszustattende Textfeld übergeben können, haben wir in der Klasse die folgende Property Set-Methode hinterlegt:
Public Property Set Datebox(txt As TextBox) Set m_txt = txt With m_txt .OnGotFocus = "[Event Procedure]" .OnKeyDown = "[Event Procedure]" .OnMouseUp = "[Event Procedure]" End With End Property
Diese weist zunächst den mit txt übergebenen Verweis auf das Datums-Textfeld der Variablen m_Txt zu.
Danach stellen wir per VBA jeweils die Ereigniseigenschaften Bei Fokuserhalt, Bei Taste ab und Bei Maustaste auf auf die Eigenschaft [Ereignisprozedur] ein.
Wenn wir nun die entsprechenden Ereignisprozeduren im Klassenmodul festlegen, werden diese genauso ausgeführt wie Ereignisprozeduren, die wir im Klassenmodul des Formulars hinterlegt haben.
Allerdings unterscheidet sich der Weg zum Anlegen der Ereignisprozeduren für eine mit dem Schlüsselwort WithEvents deklarierte Variable von dem im Formular.
Hier können wir die Ereignisprozedur nicht durch Auswahl von [Ereignisprozedur] im Eigenschaftenblatt und anschließendes Anklicken der Schaltfläche mit den drei Punkten erstellen, sondern wir müssen diese über den VBA-Editor hinzufügen.
Dazu wählen wir im Codefenster im linken Auswahlfeld den Namen der mit WithEvents deklarierten Objektvariablen aus und im rechten das gewünschte Ereignis (siehe Bild 2).

Bild 2: Hinzufügen von Ereignissen für benutzerdefinierte Objekte
Im linken Auswahlfeld erscheinen übrigens nur solche Objekte, die mit dem Schlüsselwort WithEvents deklariert wurden, oder, im Falle von Formular- oder Berichtsklassenmodulen, die Objekte für das Formular oder den Bericht und die enthaltenen Steuerelemente.
DateBox zu einem Formular zuweisen
Bevor wir uns den angepassten Code der Klasse anschauen, zeigen wir noch, wie man die Klasse produktiv einsetzen kann.
Dazu benötigen wir lediglich ein paar Zeilen Code in der Prozedur Form_Load des Klassenmoduls des Formulars und eine modulweit deklarierte Variable des Typs clsDatebox:
Dim objDatebox As clsDatebox
Das Form_Load-Ereignis ergänzen wir um die folgenden Anweisungen:
Private Sub Form_Load() Set objDatebox = New clsDatebox With objDatebox Set .Datebox = Me.txtGeburtsdatum .ActivateTabEnter = True End With End Sub
Die Prozedur initialisiert ein neues Objekt auf Basis der Klasse clsDatebox und weist dieser das mit der Funktion auszustattende Datums-Textfeld zu.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo
