Eingabe in Text- und Kombinationsfelder vereinfachen

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.
abb001.tif

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).

abb002.tif

Bild 2: Die erste Variante der vereinfachten Datumseingabe

abb003.tif

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

Schreibe einen Kommentar