Splitter für Formulare

Zusammenfassung

Erweitern Sie Ihre Formulare um Splitter-Steuerelemente, damit der Benutzer die Größe einzelner Bereiche selbst anpassen kann.

Techniken

Formulare, VBA

Voraussetzungen

Access 200 und höher

Beispieldatenbank

Splitform00.mdb

Sascha Trowitzsch, Berlin

Sie kennen sie aus fast jeder umfangreicheren Anwendung: Balken, die Fenster in Bereiche aufteilen und sich mit der Maus verschieben lassen. Im Explorer von Windows beispielsweise trennt ein solches Balkenelement die linke Seite mit dem Verzeichnisbaum von der rechten, die die Dateien abbildet. In den meisten visuellen Entwicklungsumgebungen nennt sich ein solches Balkensteuerelement Splitter. Man kann es in ein Formular einfügen und hat anschließend automatisch und ohne weitere Programmierung zwei getrennte Formularbereiche. Leider hält MS Access weder ein solches Steuerelement vor, noch sind die Formulare für diese Zwecke vorbereitet. Dabei würde sich dieses GUI-Feature gerade in Datenbanken oft gut machen. Dieser Beitrag zeigt Ihnen, wie sich solche Splitter mit etwas Handarbeit auch in Access-Formularen simulieren lassen.

Nehmen wir an, Sie möchten ein Formular erstellen, das drei durch horizontale und vertikale Splitter getrennte Bereiche enthält, wie in Bild 1 dargestellt.

Die Splitter darin befinden sich im Detailbereich des Formulars. Oben und unten zeigen sich Kopf- und Fußbereiche (wir nennen im Folgenden den vertikalen Splitter-Balken SplitterV und den horizontalen SplitterH).

Bild 1: Formular mit vertikalen und horizontalen Splittern

Auf der Suche nach einem für die Splitter-Balken geeigneten Steuerelement wird man etwa mit dem Rechteck-Steuerelement fündig. Eine Alternative wäre ein Optionsgruppenrahmen ohne Beschriftung. Beide lösen Mausereignisse wie Bei Maustaste Ab oder Bei Mausbewegung Auf, die die Voraussetzung dafür bilden, dass sich der Balken dann mit der Maus bewegen lässt. Nun sollte sich aber der Mauszeiger beim überfahren der Splitter in die bekannten NordSüd- oder OstWest-Cursor verändern, damit die Funktion des Splitters offensichtlich wird (siehe Bild 2).

Bild 2: “OstWest”- und “NordSüd”-Cursor

Unter Access lässt sich jedoch etwa einem Rechteck-Steuerelement kein bestimmter Mauszeiger zuordnen. Man müsste dies per VBA programmieren und dabei das Ereignis Bei Mausbewegung verwenden. Sobald der Mauszeiger jedoch den Splitter verlässt, müsste er wieder auf den normalen Cursor zurückgesetzt werden.

Mit einem anderen Steuerelement entledigt man sich hier jeglicher Programmierarbeit: dem MSForms-Rahmensteuerelement. Sie finden dieses ActiveX-Steuerelement in der mit jeder Access-Installation bereitgestellten Bibliothek MSForms.

Gehen Sie dazu im Formularentwurf auf den Menüeintrag Einfügen/ActiveX-Steuerelement… und wählen Sie im Dialog das Element Microsoft Forms 2.0 Frame aus. Die anschließend im Formular erscheinende Fläche verändern Sie in der Größe zu einem Balken.

Benennen Sie das Element in ctlSplitter um und stellen Sie dann im Eigenschaftsfenster unter dem Reiter Andere die Eigenschaft MousePointer auf SizeNS, falls es sich um einen horizontalen Splitter handelt, und auf SizeWE für einen vertikalen Splitter.

Beim öffnen des Formulars sehen Sie dann den gewünschten Effekt: Der Mauszeiger verändert sich in den Resize-Cursor, wenn Sie über den Balken fahren. Als ActiveX-Steuerelemente haben MSForms-Frames außerdem den Vorteil, dass sie im Formular immer im Vordergrund erscheinen. Ein normales Access-Steuerelement kann niemals ein ActiveX-Steuerelement überdecken – auch wenn dies im Formularentwurf danach aussehen sollte.

Die nächste Aufgabe ist das Bewegen des Splitters, wenn die linke Maustaste auf ihm gedrückt und dann in eine Richtung gezogen wird. Wie jedes andere Steuerelement auch hat der Splitter die Eigenschaften Left und Top, mit denen man ihn zur Laufzeit per VBA im Formular positionieren kann.

Diese Eigenschaften müssen in Abhängigkeit von Mausereignissen gesetzt werden. Im Eigenschaftsfenster des markierten Splitters suchen Sie die üblichen Mausereignisse indessen vergeblich.

Die speziellen Ereignisprozeduren von ActiveX-Steuerelementen müssen Sie nämlich allesamt im Code-Fenster des VBA-Editors anlegen: öffnen Sie das Formularmodul, wählen Sie aus dem Kombinationsfeld links oben im Code-Fenster das Steuerelement ctlSplitter aus und schon füllt sich das rechte Kombinationsfeld mit den verfügbaren Ereignisnamen.

Hier nehmen Sie das Ereignis MouseMove. Im Code wird dann automatisch die Ereignisprozedur ctlSplitter_MouseMove erzeugt, die als Parameter die X- und Y-Werte des Mauszeigers zurückgibt. Wohlgemerkt: Die X- und Y-Werte innerhalb des Splitter-Steuerelements, nicht in Relation zu Formularkoordinaten! Für einen horizontalen Splitter, der sich nach oben und unten verschieben lassen soll, sähe der Code zur Positionierung wie in Quellcode 1 aus.

Quellcode 1: Verschieben des Splitters in Y-Richtung

Private Sub ctlSplitter_MouseMove( _
    ByVal Button As Integer, _
    ByVal Shift As Integer, _
    ByVal X As Single, _
    ByVal Y As Single)
    If Button = acLeftButton Then
        ctlSplitter.Top = ctlSplitter.Top + Y
        Doevents
    End If
End Sub

Wird also die Maus bei gedrückter linker Taste (acLeftButton) über dem Splitter nach unten bewegt, dann drückt sich das im Wert des Parameters Y aus. Er wird dazu verwendet, um die Eigenschaft Top des Splitters neu zu setzen. Damit die neue Position auf dem Bildschirm auch sofort sichtbar wird, muss eine DoEvents-Anweisung zur Aktualisierung eingebaut sein, weil sie Windows unmittelbar ermöglicht, etwa Grafik-Routinen abzuarbeiten.

Der Trick an der Sache ist außerdem, dass nach Neupositionierung des Splitters die Berechnung der folgenden Werte für Y bei Mausbewegung wieder relativ zu dessen linker oberer Ecke erfolgt, die ja nun verschoben ist. Bei langsamer Mausbewegung führt das dazu, dass immer 1 für Y im Ereignis übergeben wird.

übrigens wird Quellcode 1 nicht zum Erfolg führen, wenn Sie einen MSForms-Frame als Splitter-Steuerelement verwenden: Dieser gibt im Ereignisparameter Y einen Wert zurück, der die Maßeinheit Points des Datentyps Single reflektiert. Diese Einheit ist mit den unter Access üblichen Twips nicht identisch, sondern muss erst umgerechnet werden. Die Formel dafür lautet:

1 Point = 20 Twips

Also lautet die Codezeile korrekt:

ctlSplitter.Top = ctlSplitter.Top + Y * 20

Quellcode 2: Verschieben des Splitters begrenzen

Private Sub ctlSplitter_MouseMove( _
    ByVal Button As Integer, _
    ByVal Shift As Integer, _
    ByVal X As Single, _
    ByVal Y As Single)
    Dim YTmp As Long
    If Button = acLeftButton Then
        YTmp = ctlSplitter.Top + Y
        If YTmp < 30 Then YTmp = 30
        If YTmp > 5000 Then YTmp = 5000
        ctlSplitter.Top = YTmp
        Doevents
    End If
End Sub

Die Beispieldatenbank verwendet für die Umwandlung der Einheiten der besseren übersicht halber übrigens die Hilfsfunktion Pts2Twips. Wenn Sie sicherstellen wollen, dass der Splitter mit der Maus nicht über den Rand eines Formulars hinausgezogen wird oder dass er sich nur innerhalb bestimmter Grenzen bewegt, dann bauen Sie entsprechende Bedingungen wie in Quellcode 2 ein.

Hiermit kann sich das Splitter-Steuerelement maximal bis 30 Twips an den oberen Rand bewegen und maximal 5.000 Twips (ca. 8,8 cm) nach unten.

Mit den bisher vorgestellten Techniken können Sie den Splitter im Formular verschieben und gegebenenfalls andere Steuerelemente neu positionieren; Letzteres wird später erläutert.

Ein Manko ist allerdings, dass bei in der Größe veränderbaren Formularen – der häufigste Fall in Access-Anwendungen – das Splitter-Steuerelement selbst nicht “mitwächst”.

Ein horizontaler Splitter etwa sollte aber immer die Breite des Formulars besitzen, ein vertikaler die Höhe des Detailbereichs. Alles andere sieht seltsam aus.

Folglich muss er im Ereignis Bei Größenänderung des Formulars (Form_Resize) den Abmessungen desselben angepasst werden. Doch leichter gesagt als getan, denn dazu müssen Sie erst einen Ausflug in die Logik der Abmessungen von Formularbereichen unternehmen.

Abmessungen von Formularbereichen

Sollen Ausdehnung und Positionierung von Steuerelementen innerhalb eines veränderbaren Formulars von dessen Größe abhängen, dann müssen im Ereignis Bei Größenänderung (Form_Resize) verschiedene Abmessungen des Formulars ermittelt und Koordinaten sowie Breite und Höhe der Steuerelemente neu angepasst werden.

Dabei hält Access einige Fallstricke bereit, auf die die Online-Hilfe nicht hinreichend eingeht. In Bild 3 sehen Sie schematisch ein Formular, das die Eigenschaft Veränderbar besitzt und in dem Formularkopf und -fuß eingeschaltet sind (siehe Bild 3).

Bild 3: Abmessungen von Formularbereichen

Nach dem öffnen wurde das Formular in Breite und Höhe etwas vergrößert. Das ist durch die durchgezogenen zwei horizontalen und vertikalen Linien kenntlich gemacht.

Breite eines Formulars

Nach dem öffnen ist die Formularbreite in VBA mit Me.Width zu ermitteln. Wird es in der Breite verändert, dann ändert sich diese Eigenschaft hingegen nicht und gibt weiterhin den im Entwurf gespeicherten Wert zurück. Stattdessen steht nun in Me.InsideWidth die tatsächlich sichtbare Breite.

Höhe von Formularbereichen

Hier wird es komplizierter. Eine Eigenschaft Me.Height kennt das Formular nicht, weil es vertikal aus einzelnen Bereichen wie dem Kopfbereich, dem Fußbereich und dem Detailbereich zusammengesetzt ist.

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

Schreibe einen Kommentar