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

Abb. 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 (s. Abb. 2).

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

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar