Kombinationsfelder sind wirklich praktisch, wenn es um die Auswahl von Lookup-Daten geht. Aber immerhin muss man immer noch auf die Schaltfläche zum Aufklappen der Liste klicken, um einen der Einträge auszuwählen. Wir haben uns eine noch schnellere Variante einfallen lassen, bei der Sie einfach nur mit der Maus in das Kombinationsfeld klicken und diese dann nach oben oder unten bewegen müssen, um zwischen den Einträgen zu navigieren. Dieser Beitrag zeigt, wie Sie ein Kombinationsfeld mit dieser Funktion ausstatten.
Beispieldatenbank
Als Beispiel verwenden wir eine Datenbank mit einer einfachen Kundentabelle sowie einem Formular, das die enthaltenen Datensätze per Kombinationsfeld zur Auswahl anbietet (siehe Bild 1). Das Kombinationsfeld heißt cboKunden und verwendet die folgende Abfrage als Datensatzherkunft:
Bild 1: Beispielformular mit dem Kombinationsfeld
SELECT tblKunden.KundeID, tblKunden.Firma FROM tblKunden ORDER BY tblKunden.Firma;
Damit das Primärschlüsselfeld nicht eingeblendet wird, sondern nur das Feld Firma, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein. Sie können das Kombinationsfeld nun wie gewohnt aufklappen und einen Eintrag auswählen.
Rauf und runter
Wenn der Benutzer das Kombinationsfeld öffnet, findet er dieses in der Regel leer vor (siehe Bild 2). Nun soll der Benutzer mit der Maus auf das Kombinationsfeld klicken und bei gedrückter Maustaste den Mauszeiger nach unten bewegen können, um den ersten Eintrag der Datensatzherkunft auszuwählen. Bewegt er den Mauszeiger bei gedrückter Maustaste weiter nach unten, wird der nächste Eintrag ausgewählt und so weiter. Bewegt er hingegen den Mauszeiger bei gedrückter Maustaste nach oben, wird wieder der vorherige Eintrag ausgewählt. Auf diese Weise kann der Benutzer durch alle vorhandenen Einträge navigieren.
Bild 2: Kombinationsfeld ohne Auswahl
Benötigte Ereignisse
Bevor wir die neue Funktion programmieren, müssen wir uns überlegen, welche Ereignisse wir hier verwenden können. Ganz sicher werden wir das Ereignis Bei Mausbewegung des Kombinationsfeldes benötigen, denn dieses wird ja immer ausgelöst, wenn sich die Maus ein kleines Stückchen bewegt hat.
Gegebenenfalls benötigen wir auch noch die beiden Ereignisse Bei Maustaste ab und Bei Maustaste auf des Kombinationsfeldes, um Vorbereitungen und abschließende Arbeiten für den eigentlichen Vorgang des Ziehens mit der Maus durchzuführen.
Das Ereignis Bei Mausbewegung
Dieses für unsere Lösung existenzielle Ereignis wird alle paar Millisekunden ausgelöst. Es liefert dann mit den folgenden Parametern wichtige Werte:
- Button: Gibt an, welche Taste der Maus beim Bewegen der Maus gedrückt ist. Es gibt die für uns interessanten Werte 0 (keine Taste), 1 (linke Taste) und 2 (rechte Taste).
- Shift: Gibt an, ob der Benutzer beim Bewegen der Maus eine der Tasten Umschalt, Strg oder Alt gedrückt hält.
- X: Liefert die aktuelle X-Position des Mauszeigers.
- Y: Liefert die aktuelle Y-Position des Mauszeigers.
Die Positionen X und Y werden in 15er-Schritten und in der Größe Twips geliefert. Jeder Bildschirmpunkt hat eine bestimmte Anzahl Twips, wobei diese Anzahl von verschiedenen Faktoren abhängen kann, in der Regel aber 15 beträgt.
Das Ereignis Bei Maustaste ab
Dieses Ereignis wird beim Herunterdrücken der Maustaste ausgelöst. Es liefert die gleichen Parameter wie das Ereignis Bei Mausbewegung.
Programmierung der Funktion
Grundsätzlich sieht die Vorgehensweise wie folgt aus: Wir definieren eine Ereignisprozedur für das Ereignis Bei Mausbewegung. In dieser prüfen wir, ob sich die vertikale Position des Mauszeigers verändert hat und in welchem Umfang. Zusätzlich legen wir fest, nach welcher in der Y-Richtung zurückgelegten Strecke der nächste oder der vorherige Eintrag des Listenfeldes angezeigt werden soll.
Wir könnten die kleinste Einheit wählen, also 15 Twips, aber dann würden wir sehr schnell durch die Einträge rutschen und hätten kaum die Möglichkeit, gezielt einen Eintrag auszuwählen. Also stellen wir die zurückzulegende Strecke etwas größer ein, zum Beispiel auf 150 Twips. Dies legen wir in einer Konstanten namens cIntervall fest, die wir im Kopf des Klassenmoduls des Formulars wie folgt deklarieren:
Const cIntervall As Integer = 150
Um zu prüfen, ob der Mauszeiger seit dem letzten ändern des ausgewählten Eintrags die in cIntervall angegebene Strecke zurückgelegt hat, müssen wir die Position beim ändern des Eintrags speichern. Dazu verwenden wir eine weitere Variable, die wir ebenfalls modulweit deklarieren und die wie folgt aussieht:
Dim lngPosVorher As Long
Wir wollen immer nur bis zum letzten Eintrag scrollen, nicht darüber hinaus. Daher deklarieren wir eine Variable, mit der wir die Anzahl der enthaltenen Einträge speichern:
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