Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Manchmal nervt es einfach, Daten in Textfelder einzugeben, aber in vielen Fällen lässt sich dies nicht ändern. Wenn das Feld numerische Informationen enthält, gibt es aber durchaus Möglichkeiten: Sie können es dann beispielsweise so programmieren, dass der Benutzer den enthaltenen Wert mit den Cursortasten erhöht oder vermindert.
Eingabevereinfachung
Die Eingabe von Daten erfolgt leider immer noch nicht durch Gedankenkraft oder über ein mit dem Gehirn verbundenes USB-Kabel. Bis es so weit ist, sollten Sie Ihren Benutzern diese Arbeit zumindest vereinfachen – einige Anregungen finden Sie in diesem Artikel. Im Einzelnen sieht das folgendermaßen aus, wobei die Cursortasten jedes Mal eine entscheidende Rolle spielen:
Die ersten beiden Beispiele zeigen, wie Sie die Eingabe von Datumsangaben mit verschiedenen Tastenkombinationen erleichtern. üblicherweise gibt man Datumsangaben wie ganz normalen Text ein, manche Anwendungen bieten dazu alternativ ein spezielles Steuerelement an, mit dem sich das Datum per Maus zusammenklicken lässt.
Der Nachteil dieser Lösungen ist aber in der Regel, dass der Benutzer dazu die Maus verwenden muss. Wer schnell arbeiten möchte, sollte sich allerdings auf die Tastatur konzentrieren – das Greifen der Maus, das Anklicken der Schaltfläche zum öffnen des Steuerelements zur Datumseingabe und die Datumseingabe selbst nehmen offensichtlich nicht weniger Zeit in Anspruch als das Eingeben des Datums mit der Tastatur.
Die erste Variante zur Eingabe von Datumsangaben verwendet verschiedene Tastenkombinationen, um die Teile des Datums (Tag, Monat, Jahr) zu ändern.
Die Schaltflächen Cursor nach oben und Cursor nach unten sind beispielsweise für das ändern des Tages verantwortlich, die Monate und Jahre passt man mit den gleichen Schaltflächen bei gleichzeitig gedrückter Strg– und Alt-Taste an.
Die zweite Variante kommt nur mit den beiden Tasten Cursor nach oben und Cursor nach unten aus. Um die verschiedenen Datumselemente zu verändern, positioniert man die Einfügemarke zunächst auf dem entsprechenden Datumsteil und passt diesen dann mit den Cursortasten an.
Auch Zahlen lassen sich in vielen Fällen leichter mit Cursortasten als mit den Zahlentasten selbst verändern.
Das dritte Beispiel zeigt daher, wie Sie die in einem Textfeld enthaltenen Zahlen per Cursortaste nach oben beziehungsweise nach unten korrigieren.
Zuletzt noch ein Beispiel für den Einsatz von Kombinationsfeldern: Wer dort einen neuen Eintrag auswählen möchte, muss dies erst entweder mit der Maus oder durch eine Tastenkombination (entweder F4 oder Alt + Cursor nach unten) erledigen. Viel schöner wäre es doch, wenn man die in unmittelbarer Umgebung des aktuell ausgewählten Eintrags befindlichen Elemente ganz einfach mit den Tasten Umschalt + Strg + Alt + Cursor nach oben beziehungsweise Cursor nach unten auswählen könnte – und zwar ohne das Aufklappen des Kombinationsfeldes.
Nachteile
Bei all den nachfolgend vorgestellten Beispielen ist zu berücksichtigen, dass meist die Cursortasten zum Einsatz kommen. Diese dienen üblicherweise zum Wechseln des aktuell markierten Steuerelements.
Dies wird aber ohnehin selbst in den Dialogen der Office-Anwendungen und in Access-Formularen unterschiedlich gehandhabt (Erstere erlauben beispielsweise nicht das Verlassen von Kombinationsfeldern per Cursortaste, Letztere schon).
Wer kann, sollte also am besten die Vorgehensweise seiner Benutzer studieren und gegebenenfalls alternative Steuermöglichkeiten vorsehen, die der Benutzer per Option einstellen kann.
Grundlegendes
Die wichtigste Technik dieses Beitrags ist das Abfangen von Benutzereingaben, und zwar der Cursortasten. Sie müssen erkennen, wann der Benutzer in den entsprechenden Steuerelementen die Cursor nach oben und Cursor nach unten-Tasten und ihre Kombinationen mit der Umschalt-, der Strg– und der Alt-Taste betätigt. Dabei hilft die Ereignisprozedur Bei Taste ab, die jedes Steuerelement bereitstellt. Die passende Ereignisprozedur stellt zwei Parameter zur Verfügung:
- KeyCode: Gibt den Zahlencode der gedrückten Taste zurück. Für die Cursortasten sind dies beispielsweise die Werte 37 (nach links), 38 (nach oben), 39 (nach rechts) und 40 (nach unten). Man vereinfacht sich das Leben, wenn man die passenden VB-Konstanten verwendet, die beispielsweise der Objektkatalog offenbart (siehe Bild 1). Sie können aber auch einfach den Wert von KeyCode per Debug.Print ausgeben lassen, wenn Sie den Zahlenwert einer Taste erfahren möchten.
- Shift: Gibt an, ob eine der Tasten Umschalt (1), Strg (2) oder Alt (4) gedrückt wurde; ist dies nicht der Fall, lautet der Wert 0. Kombinationen der Tasten erkennt man an der Summe der entsprechenden Werte. Der Wert 7 würde beispielsweise bedeuten, dass der Benutzer alle drei Tasten gleichzeitig gedrückt hätte (1+2+4). Auch hier gibt es Konstanten: acShiftMask, acCtrlMask und acAltMask.
Bild 1: Der Objektkatalog liefert bei Bedarf die VB-Konstanten für die KeyCode-Werte.
Wenn Sie nun möchten, dass etwas Spezielles passiert, wenn der Benutzer innerhalb eines Textfeldes die Cursor nach unten-Taste drückt, verwenden Sie etwa die folgende Routine:
Private Sub txtBeispiel_KeyDown(KeyCode _
As Integer, Shift As Integer) If KeyCode = vbKeyDown Then 'Do something KeyCode = 0 End If End Sub
Sie fragen also über den Parameter KeyCode ab, ob der Benutzer die Cursor nach unten-Taste betätigt hat, und lassen in diesem Fall den gewünschten Code ausführen.
Wichtig ist, dass Sie dem Parameter KeyCode im Anschluss den Wert 0 zuweisen, damit Access auch nur die hier angegebene Aktion und nicht die eigentliche durch das Betätigen der Taste ausgelöste Funktion aufruft.
Natürlich kann dies auch gewünscht sein – in diesem Fall lassen Sie die Zeile einfach weg.
Tastenvorschau
Wie die einzelnen Steuerelemente besitzt auch das Formular ein Bei Taste ab-Ereignis. Mit der Eigenschaft Tastenvorschau legen Sie fest, ob dieses ausgeführt werden soll. Ist diese Eigenschaft auf Ja eingestellt und enthalten sowohl das Formular als auch ein Steuerelement ein Bei Taste ab-Ereignis, wird das des Formulars zuerst ausgeführt. Beachten Sie, dass ein Einstellen von KeyCode auf den Wert 0 sich auch auf das nachfolgend aufgerufene Ereignis des Steuerelements auswirkt.
Textfeldinhalt beeinflussen
Grundsätzlich gibt man Texte in Textfelder ein, indem man den Fokus auf das Textfeld setzt und dann mit der Tastatur den passenden Wert eintippt. Gegebenenfalls kann man dort natürlich auch Informationen aus der Zwischenablage einfügen.
Wenn das Feld schon einen Wert enthält, muss man diesen erst noch löschen, bevor man den neuen Wert einträgt – dies kann man sich erleichtern, indem man dafür sorgt, dass beim Eintreten in ein Feld direkt der komplette Inhalt markiert wird.
Die Eingabe des ersten neuen Zeichens führt dann dazu, dass der vorhandene Inhalt gelöscht wird (mehr dazu im Beitrag Verhalten beim Feldeintritt in der kommenden Ausgabe, Shortlink 540).
Datumseingabe vereinfachen, Variante 1
Die Eingabe von Datumsangaben können Sie sich bereits mit den richtigen Tastenkombinationen erleichtern (siehe Bild 2).
Bild 2: Die erste Variante der vereinfachten Datumseingabe
Bild 2: Nur mit den Cursortasten ist die Datumseingabe noch intuitiver.
So fügen Strg + Umschalt + , das Datum und Strg + Umschalt + . die aktuelle Uhrzeit hinzu. Diese Tastenkombinationen kennt aber in der Regel kein normaler Benutzer. Und das Problem ist, dass er auch sämtliche Tastenkombinationen, die Sie für Ihre Steuerelemente vorsehen, nicht kennt. Es gibt also zwei Möglichkeiten:
- Der Benutzer gibt die Daten wie üblich ein.
- Sie teilen dem Benutzer die Tastenkombinationen mit, die ihm die Arbeit bei der Dateneingabe erleichtern.
Letzteres setzt voraus, dass der Benutzer überhaupt von seiner gewohnten Arbeitsweise abweichen möchte, daher können Sie ihm die Vereinfachung natürlich nur anbieten. Das erledigen Sie beispielsweise durch einen entsprechenden Steuerelement-TipText. Bevor Sie das tun, schauen Sie sich allerdings erstmal an, wie man die Datumseingabe überhaupt vereinfachen kann.
Die Routine, die hier durch das Bei Taste Ab-Ereignis ausgelöst wird, sieht wie in Listing 1 aus. Sie prüft zunächst, welchen Wert Shift liefert, und dann den jeweiligen KeyCode. Zuvor prüft die Routine allerdings noch, ob das Textfeld überhaupt einen Wert enthält, und fügt, wenn das nicht der Fall ist, das aktuelle Datum ein. Ist ein Datum vorhanden, wirken sich einige Tastenkombinationen wie folgt aus:
Listing 1: Anpassen des Datums in einem Textfeld nur mit Strg, Alt, Cursor nach oben und Cursor nach unten.
Private Sub txtDatum_KeyDown(KeyCode As Integer, Shift As Integer)
Dim txt As Access.TextBox
If KeyCode = vbKeyUp Or KeyCode = vbKeyDown Then
Set txt = Me!txtDatum
If Len(Nz(txt.Text)) = 0 Then
txt.Text = Date
Else
Select Case Shift
Case 0
Select Case KeyCode
Case vbKeyUp
txt.Text = DateAdd("d", 1, txt.Text)
Case vbKeyDown
txt.Text = DateAdd("d", -1, txt.Text)
End Select
Case acCtrlMask
Select Case KeyCode
Case vbKeyUp
txt.Text = DateAdd("m", 1, txt.Text)
Case vbKeyDown
txt.Text = DateAdd("m", -1, txt.Text)
End Select
Case acAltMask
Select Case KeyCode
Case vbKeyUp
txt.Text = DateAdd("yyyy", 1, txt.Text)
Case vbKeyDown
txt.Text = DateAdd("yyyy", -1, txt.Text)
&
- Cursor nach oben: nächster Tag
- Cursor nach unten: vorheriger Tag
- Strg + Cursor nach oben: nächster Monat
- Strg + Cursor nach unten: vorheriger Monat
- Alt + Cursor nach oben: nächstes Jahr
- Alt + Cursor nach unten: vorheriges Jahr
Die dabei verwendete Funktion DateAdd ist dabei so schlau, dass beispielsweise das Addieren eines Monats zum Datum 31.1.2007 automatisch den 28.2.2007 ergibt.
Wichtig sind hier folgende Aspekte: Arbeiten Sie immer mit der Text-Eigenschaft des jeweiligen Wertes. Der Grund ist, dass beispielsweise Me!txtDatum eigentlich den Wert der Eigenschaft Me!txtDatum.Value liefert. Wenn der Benutzer jedoch den Inhalt des Feldes ändert, ohne das Feld zu aktualisieren, indem er beispielsweise zu einem anderen Feld wechselt oder den Datensatz speichert, besitzt die Eigenschaft Value noch immer den Wert, den das Feld zu Beginn hatte. Die Text-Eigenschaft gibt immer den angezeigten Inhalt eines Textfeldes aus.
Die Routine prüft zunächst, ob das Textfeld noch leer ist, und fügt gegebenenfalls das aktuelle Datum hinzu (dies ist Geschmackssache; man könnte auch das Datum des vorherigen Datensatzes als Standardwert vorgeben). Anschließend führt sie die Aktion für die jeweilige Tastenkombination aus.
Datumseingabe vereinfachen, Variante 2
Die zweite Variante soll auf zusätzliche Tasten wie die Strg– und die Alt-Taste verzichten und genau den Datumsteil um eins erhöhen oder vermindern, auf dem sich die Einfügemarke gerade befindet. Zusätzlich soll dieser Teil komplett markiert werden, damit der Benutzer gut erkennen kann, auf welchen Teil sich das Betätigen der Tasten Cursor nach oben und Cursor nach unten auswirkt. Auch die beiden Tasten Cursor nach links und Cursor nach rechts werden hier berücksichtigt: Sie sorgen dafür, dass jeweils der benachbarte Teil des Datums angesprungen und markiert wird.
Das ist nicht ganz trivial und bedarf vor allem eines Hinweises: Die Routine aus Listing 2 funktioniert nur, wenn das Kombinationsfeld das deutsche Datumsformat (dd.mm.yyyy) enthält. Für andere Formate sind entsprechende Anpassungen notwendig, eine flexible Variante hätte hier den Rahmen gesprengt.
Listing 2: Einstellen des Datums mit den vier Cursortasten (Teil 1)
Private Sub txtDatumNachPosition_KeyDown(KeyCode As Integer, Shift As Integer)
Dim txt As Access.TextBox
Dim intDatumsteil As eDatumsteil
Dim intPosition As Integer
Dim intTrenner1 As Integer
Dim intTrenner2 As Integer
If KeyCode >= vbKeyLeft And KeyCode <= vbKeyDown Then
Set txt = Me!txtDatumNachPosition
If Len(Nz(txt.Text, "")) = 0 Then
txt.Text = Date
End If
intPosition = txt.SelStart
intTrenner1 = InStr(1, txt.Text, cStrTrennzeichen)
intTrenner2 = InStr(intTrenner1 + 1, txt.Text, cStrTrennzeichen)
Select Case intPosition
Case Is < intTrenner1
intDatumsteil = eTag
Case Is < intTrenner2
intDatumsteil = eMonat
Case Else
intDatumsteil = eJahr
End Select
Select Case KeyCode
Case vbKeyLeft
Select Case intDatumsteil
Case eTag
intDatumsteil = eJahr
txt.SelStart = intTrenner2
txt.SelLength = Len(txt.Text) – intTrenner2 + 1
Case eMonat
intDatumsteil = eTag
txt.SelStart = 0
txt.SelLength = intTrenner1 – 1
&
Case vbKeyUp
Select Case intDatumsteil
Case eTag
txt.Text = DateAdd("d", 1, txt.Text)
txt.SelStart = 0
txt.SelLength = intTrenner1 – 1
Case eMonat
txt.Text = DateAdd("m", 1, txt.Text)
txt.SelStart = intTrenner1
txt.SelLength = intTrenner2 – intTrenner1 – 1
Case eJahr
txt.Text = DateAdd("yyyy", 1, txt.Text)
txt.SelStart = intTrenner2
txt.SelLength = Len(txt.Text) – intTrenner2 + 1
End Select
Case vbKeyRight
Select Case intDatumsteil
Case eTag
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo