Steuerelemente im Eigenbau: Range Control

Der Fundus an Access-Steuerelementen fällt aus heutiger Sicht, gerade im Vergleich zu anderen visuellen Entwicklungsumgebungen, etwas bescheiden aus. Zwar lassen sich allerlei ActiveX-Steuerelemente in Formulare integrieren, doch beliebt ist dies bei vielen Entwicklern wegen der externen, unter Admin-Rechten zu registrierenden, Komponenten nicht besonders. Abhilfe schaffen können aber Steuerelemente, die Sie mit Bordmitteln einfach selbst erstellen. Wir stellen hier ein Beispiel vor: das Range Control.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1609_RangeCtl.accdb.

Was ist denn ein Range Control

Eine übersetzung des Begriffs wäre Bereichssteuerelement. Sie kennen solche Regler etwa von Webshops oder Shopping-Portalen, wo Ihnen angeboten wird, die angezeigten Produkte über eine Preisspanne zu filtern. Dabei können Unter- und Obergrenzen mit der Maus und den Ziehpunkten des Elements eingestellt werden. Bild 1 zeigt unsere Umsetzung in einem Testformular. Mit vier Range Controls stellen sie dort visuell Wertebereiche ein.

Unterschiedliche Wertebereiche können im Testformular mithilfe der vier Range Controls mit der Maus über Ziehpunkte eingestellt werden

Bild 1: Unterschiedliche Wertebereiche können im Testformular mithilfe der vier Range Controls mit der Maus über Ziehpunkte eingestellt werden

Ein Anwendungsfall für derartige Steuerelemente wäre etwa die Filterung von Datensätzen. Im Datenblatt von Access können Sie bereits, je nach Felddatentyp, Wertebereiche zur Filterung der Anzeige bestimmen. Klicken Sie etwa, wie im Datenblatt zur Tabelle tblArtikel in Bild 2, auf den Dropdown-Pfeil des Spaltenkopfs zu Einzelpreisen. Es öffnet sich das Filtermenü mit diversen Möglichkeiten. Um einen Zahlenbereich festzulegen navigieren Sie über Zahlenfilter auf den Untermenüeintrag Zwischen…. Es erscheint ein einfaches Dialogfenster zur manuellen Eingabe der Bereichsgrenzen für die Preise, nach dessen Bestätigung sich die Datensätze entsprechend filtern. Während dieses Feature im Datenblatt noch ganz praktisch ist, verhielte es sich in Formularen wegen der Menüverschachtelung etwas undurchsichtig. Hier käme man mit einem Range Control schneller zum Ziel.

Menü und Dialog für das Filtern nach Wertebereich in einem Datenblatt

Bild 2: Menü und Dialog für das Filtern nach Wertebereich in einem Datenblatt

Formular als Steuerelement

Wenn Sie ein neues virtuelles Steuerelement entwickeln, werden Sie dieses in der Regel aus mehreren verfügbaren Access-Steuerelementen zusammensetzen wollen. Das könnten Sie direkt in jenem Formular tun, in dem dieses zum Einsatz kommen soll. Sobald dies jedoch in mehreren Formularen geschehen soll oder Sie das neue Element in andere Datenbanken importieren möchten, wird der Aufwand zu groß.

Die beteiligten Steuerelemente müssten alle kopiert werden und die zugehörigen Code-Abschnitte ebenso. Bequemer kommen Sie weg, wenn Sie die Steuerelemente und den Code in einem eigenen Formular anlegen, welches Sie dann schließlich nur als Unterformular in andere einsetzen. Zudem lässt sich dieses dann als Objekt auch in andere Datenbanken exportieren.

Eigenes Range Control

In der Beispieldatenbank finden Sie das neue Steuerelement in Gestalt des Formulars sfrmRanger. Sein Entwurf zeigt sich in Bild 3. Sie können es auch unmittelbar öffnen und bedienen, wie in Bild 4 dargestellt. Die Breite des virtuellen Steuerelements passt sich dabei der Größe des Formulars an, dessen Rahmen auf Veränderbar eingestellt ist, wodurch es mit der Maus dimensioniert werden kann. Dies wirkt sich später auch aus, wenn Sie es als Unterformular dimensionieren.

Entwurfsansicht des Range Control-Formulars

Bild 3: Entwurfsansicht des Range Control-Formulars

Das Range Control-Formular zur Laufzeit nach dem öffnen

Bild 4: Das Range Control-Formular zur Laufzeit nach dem öffnen

Die weiteren relevanten Einstellungen des Formulars: Der Datenbankmarkierer ist ausgeschaltet und ebenso die Navigationsschaltflächen. Die Standardansicht ist Einzelnes Formular. Gleichzeitig ist dies die einzige zugelassene Ansicht. Es gibt auch keine Trennlinien oder Bildlaufleisten.

Sieben Steuerelemente ergeben zusammen das Range Control. Die beiden Ziehpunkte sind Schaltflächen, die über deren Design-Eigenschaften auf blaue und violette Hintergrundfarbe mit Verlauf eingestellt sind (Bild 5). Außerdem ist ihr Rahmen rund (Bild 6). Sie erreichen diese Layout-Steuerung bei markiertem Button über den Ribbon Format | Steuerelementformatierung und das Menü zu Fülleffekt, sowie die Schaltfläche Form ändern.

Farbverlauf für die Buttons

Bild 5: Farbverlauf für die Buttons

Form für die Buttons

Bild 6: Form für die Buttons

Die beiden Schaltflächen heißen cmd1 und cmd2. Für den linken und rechten Rand des Elements kommen ebenfalls Schaltflächen zum Einsatz, die sich cmdL und cmdR nennen. Sie sind auf ähnliche Weise formatiert, wie die Ziehpunkte.

Unter diesen vier Schaltflächen liegen die zwei Rechteck-Steuerelemente r0 und r1. r0 ist grau gefüllt und stellt den Hintergrundbalken dar, r1 ist blau und symbolisiert den gewählten Bereich. Damit diese sechs Elemente korrekt angezeigt werden, muss eine bestimmte Z-Order eingehalten werden, weil sie ja übereinander liegen. Die Z-Order ist jene Reihenfolge, in der Steuerelemente übereinander zu liegen kommen, also deren Tiefeneigenschaft. Unter Access lässt sich auf diese Z-Order direkt leider weder über die Oberfläche beim Entwurf, noch per VBA zugreifen. Stattdessen bemühen Sie die beiden Ribbon-Schaltflächen In den Vordergrund und In den Hintergrund im Ribbon-Tab Anordnen ganz rechts. Für unser Beispiel gehen Sie dabei so vor:

Markieren Sie r0 und klicken In den Hintergrund. Markieren Sie nun r1 und klicken In den Vordergrund. Schließlich markieren Sie cmdL, cmd1, cmd2 und cmdR und klicken abermals In den Vordergrund. Damit ist gewährleistet, dass die Buttons nie hinter die beiden Rechteck-Steuerelemente geraten.

Ein Bezeichnungsfeld LblVal am rechten Rand des Formulars dient zur Anzeige des eingestellten Wertebereichs.

Da das Range Control in der Breite variabel ausfallen soll, müssen sich die enthaltenen Steuerelemente entsprechend der Größenänderung des Formulars in Position und Breite anpassen (s. Bild 7). Der Versuch, dies über das Verankern-Feature der Elemente zu bewerkstelligen lief indessen ins Leere. Zwar lassen sich die Anpassungen damit visuell korrekt steuern, doch die aus den Button-Positionen abgeleiteten Werte können damit leider nicht mehr ermittelt werden. Stelen Sie etwa den Hintergrundbalken r0 auf Quer nach oben dehnen ein, so macht er die Größenänderungen des Formular anstandslos mit. Möchten Sie nun dessen Breite ermitteln, die ja die Basis für den Wertebereich darstellt, so würden Sie dafür die VBA-Eigenschaft Width des Steuerelements verwenden. Die jedoch bleibt auf dem Wert stehen, der im Entwurf angelegt wurde. Das Dehnen ändert also Width nicht! Gleiches gilt etwa für Left bei Steuerelementen, die auf Oben rechts eingestellt sind. Die linke Position wandert dann zwar im Formular bei Größenänderung, doch Left bleibt konstant auf dem im Entwurf festgelegten Wert.

Bei Größenänderung des Formulars positionieren und dimensionieren sich die integrierten Elemente passend

Bild 7: Bei Größenänderung des Formulars positionieren und dimensionieren sich die integrierten Elemente passend

Deshalb kommt man nicht umhin, die Positionierung stattdessen per VBA im Ereignis Bei Größenänderung (Form_Resize) des Formulars vorzunehmen. Listing 1 zeigt den überschaubaren Code hierfür. Der linke Rand der rechten Bereichsschaltfläche cmdR ergibt sich aus der Breite des Formulars zur Laufzeit (InsideWidth, nicht Width!) minus der Breite des Labels LblVal minus seiner eigenen Breite minus 300 Twips. Die Position des Labels LblVal wiederum errechnet sich ähnlich. Die Breite des Hintergrundbalkens r0 ermittelt sich aus der Formularbreite minus Label LblVal minus 150 Twips. Die linke Bereichsschaltfläche cmdL hingegen bleibt an Ort und Stelle. Die beiden Ziehpunkt-Buttons cmd1 und cmd2, sowie der Bereichsbalken r1, aber werden ja nicht in dieser Prozedur eingestellt, sondern beim Ziehen mit der Maus; und wie das geht erfahren Sie im Folgenden.

Private Sub Form_Resize()
     On Error Resume Next
     cmdR.Left = Me.InsideWidth - LblVal.Width - cmdR.Width - 300
     LblVal.Left = Me.InsideWidth - LblVal.Width - 150
     r0.Width = cmdR.Left - cmdL.Left
End Sub

Listing 1: Positionierung der Steuerelemente des Formulars bei Größenänderung in der Resize-Ereignisprozedur

Bewegen von Steuerelementen mit der Maus

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar