Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2008.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Programmieren Sie Steuerelemente so, dass Sie diese mit der Maus zur Laufzeit verschieben können.

Techniken

Formulare, Steuerelemente, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

SteuerelementeVerschieben.mdb

Shortlink

578

Steuerelemente zur Laufzeit verschieben

André Minhorst, Duisburg

Was soll das denn? Steuerelemente verschieben - zur Laufzeit? Soll der Benutzer nun aktiv in die Gestaltung der Benutzeroberfläche eingreifen? Mitnichten: Es gibt jedoch eine Reihe ernsthafter Anwendungsfälle, bei denen das Verschieben von Steuerelementen Sinn macht. Einen haben wir im Beitrag „Splitter für Formulare“ bereits vorgestellt, aber es gibt noch mehr Gelegenheiten zum Einsatz dieser Technik, die wir hier grundlegend darstellen.

Während der selbst programmierte Splitter aus dem Artikel Splitter für Formulare (Shortlink 397) rein der Optimierung der Benutzeroberfläche dient, gibt es auch Möglichkeiten, verschiebbare Steuerelemente zur Darstellung von Daten einzusetzen.

Wie wäre es etwa mit einem Terminkalender, dessen Termine Sie nach Lust und Laune mit der Maus bewegen können - oder einer Raumplanung, die das Platzieren von Tischen und Stühlen erlaubt? Davon sind wir jedoch noch ein Stück entfernt, denn zunächst ist ein Blick auf die grundlegende Technik nötig.

Für den Start verwenden wir einfach ein Rechteck-Steuerelement, das Sie durch Anpassen einiger Eigenschaften ein wenig verschönern (s. Abb. 1). Der Schlüssel zum Bewegen eines Steuerelements ist ein VBA-Ereignis, das immer dann ausgelöst wird, wenn sich der Mauszeiger über dem Steuerelement befindet, dem das Ereignis zugeordnet ist. Es heißt Bei Mausbewegung und löst die folgende Prozedur aus, die bereits mit einer Anweisung zum Ausgeben der durch die Parameter gelieferten Werte gefüllt ist:

missing image file

Abb. 1: Dieses Rechteck-Steuerelement soll gleich in der Formularansicht durch die Gegend geschoben werden.

Private Sub rctBeispiel_MouseMove(Button As _

    Integer, Shift As Integer, X As Single, _

    Y As Single)

    Debug.Print Button, Shift, X, Y

    End Sub

Diese Routine ist auch der erste Schritt auf dem Weg zum Verschieben eines Steuerelements: Wenn Sie nun das Access-Fenster und das VBA-Fenster so nebeneinander positionieren, dass Sie das Direktfenster sehen, können Sie einfach einmal mit der Maus mit und ohne gedrückte Maustasten über das Steuerelement fahren. Die Parameter lesen sich dabei wie folgt:

  • Button liefert einen Zahlenwert, der die aktuell betätigte Maustaste repräsentiert. 1 entspricht der linken, 2 der rechten und der Wert 3 zeigt an, dass beide Maustasten zugleich gedrückt werden. Diese Zahlenwerte entsprechen den Konstanten acLeftButton (1), acRightButton (2) und acMiddleButton (4).
  • Shift zeigt an, ob der Benutzer während der Mausbewegung eine oder mehrere der Tasten Shift (1), Strg (2) oder Alt (4) gedrückt hält. Es sind auch Kombinationen möglich, die sich in der Summe der Zahlenwerte widerspiegeln: 7 entspricht beispielsweise der Tastenkombination Shift + Strg + Alt (auch hier gibt es passende Konstanten: acShiftMask (1), acCtrlMask (2) und acAltMask (4)).
  • X und Y entsprechen der horizontalen und der vertikalen Entfernung von der linken oberen Ecke des Steuerelements.

X und Y werden in Twips geliefert.

Steuerelement verschieben

Das Steuerelement soll nur verschoben werden, wenn der Benutzer die typische Drag-and-Drop-Mimik ausführt, also die Maustaste anklickt, während sich der Mauszeiger über dem Steuerelement befindet, und das Steuerelement verschiebt, wenn der Benutzer die Maus bei gedrückter Maustaste bewegt. Das lässt sich theoretisch einfach nachbilden: Sie brauchen sich nur einmal zu Beginn des Drag-and-Drop-Vorgangs die Position des Mauszeigers zu merken und passen dann bei jedem Aufruf von Bei Mausbewegung die Position des Steuerelements über die durch die Maus zurückgelegte Strecke an.

Für die X-Komponenten bedeutet dies: X-Position des Mauszeigers merken, X-Position des Formulars ermitteln, alte X-Position des Mauszeigers von der neuen X-Position abziehen und X-Position des Formulars um diese Differenz ändern. Sie brauchen also zunächst zwei modulweit deklarierte Variablen zum Speichern der Startposition des Mauszeigers:

Dim lngXStart As Long

Dim lngYStart As Long

Diese ermitteln Sie einmalig beim Herunterdrücken der linken Maustaste:

Private Sub rctBeispiel_MouseDown(Button As _

    Integer, Shift As Integer, X As Single, _

    Y As Single)

    If Button = 1 Then

        lngXStart = X

        lngYStart = Y

    End If

    End Sub

Die folgende Routine wird nicht etwa in festen zeitlichen Intervallen, sondern beim Verschieben des Mauszeigers um eine bestimmte Entfernung in eine der beiden Richtungen ausgelöst. Sie prüft, ob die linke Maustaste gedrückt ist, und stellt die Top- und die Left-Eigenschaften des Steuerelements ein, die für seine Position verantwortlich sind.

Private Sub rctBeispiel_MouseMove(Button As _

    Integer, Shift As Integer, X As Single, _

    Y As Single)

    If Button = 1 Then

        With rctBeispiel

        .Top = .Top + Y - lngYStart

        .Left = .Left + X - lngXStart

        End With

    End If

    End Sub

Beim Ausprobieren dieser Technik werden Sie schnell an deren Grenzen stoßen - genau dann nämlich, wenn das Steuerelement an die Grenzen des Formulars stößt. Wenn die Routine versucht, das Steuerelement aus dem Formular herauszubewegen, löst dies eine Fehlermeldung aus. Dies umgehen Sie durch aufwändige Prüfungen oder durch Hinzufügen der folgenden Zeile in den Kopf der Routine:

On Error Resume Next

Größe des Steuerelements verändern

Wenn Sie ein Steuerelement schon zur Laufzeit verschieben, können Sie auch seine Größe anpassen.

Das soll aus Gründen der Einfachheit nur funktionieren, wenn der Benutzer das Steuerelement mit dem Mauszeiger an der rechten oder unteren Kante „anfasst“.

Das Wichtigste ist, dass der Benutzer weiß, dass er das Steuerelement nun nicht verschiebt, sondern vergrößert oder verkleinert. Und dazu ändern Sie den Mauszeiger in eine entsprechende Linie mit zwei Pfeilspitzen - genau so wie in Abb. 2.

missing image file

Abb. 2: Anzeigen eines alternativen Mauszeigers beim Ã"ndern der Größe eines Steuerelements

Das Ã"ndern des Mauszeigers ist relativ einfach: Sie erreichen dies durch den Befehl Screen.MousePointer = 9, für den gleichen Pfeil in vertikaler Ausrichtung geben Sie den Wert 11 an.

Damit der jeweilige Mauszeiger nur am rechten beziehungsweise unteren Rand erscheint, fügen Sie eine kleine If...Then-Bedingung ein, die prüft, ob sich der Pfeil innerhalb eines Bereichs von 100 Twips links vom rechten Rand oder oberhalb vom unteren Rand befindet. Falls dies der Fall ist, müssen Sie noch prüfen, ob der Benutzer bei der Mausbewegung auch noch die linke Maustaste geklickt hat: Dann ändern Sie den Wert der Eigenschaften Width beziehungsweise Height des Steuerelements entsprechend.

Das folgende Listing zeigt die Ereignisprozedur, die beim Bewegen der Maus ausgelöst wird, im Zusammenhang:

Private Sub rctBeispiel_MouseMove(Button As _

    Integer, Shift As Integer, X As Single, _

    Y As Single)

    On Error Resume Next

    With rctBeispiel

    If X > .Width - 100 Then

        If Button = 1 Then

            .Width = .Width + X - lngXStart

            lngXStart = X

        End If

        Screen.MousePointer = 9

    ElseIf Y > .Height - 100 Then

        Screen.MousePointer = 7

        If Button = 1 Then

            .Height = .Height + Y - lngYStart

            lngYStart = Y

        End If

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Verwandte Beiträge:

Ereignisprozeduren implantieren

Modale Dialoge mal anders

Flexible Datumstextfelder

TreeView-Elemente im Griff

Listenfeld und Details in einem Formular

HTML-Editor-Steuerelement

Zugriff auf Daten in Formularen und Steuerelementen

Zugriff auf Formulare

Das Optionsgruppen-Steuerelement

Validieren mit Klasse

Formulare im Blickpunkt

Registersteuerelemente von A-Z

Access 2007: Bilder und Schaltflächen

Unterformulare: Daten anlegen und löschen

Tipps und Tricks

Access-FAQ: Rund um Access

.NET-Klassen und Formulare in Access nutzen

Das Append-Only-Memofeld

Lookup-Daten verwalten

TreeView-Konfigurator

Formularposition speichern und wiederherstellen

Ereignisprozeduren

Auswahlfelder im Ribbon

Daten visualisieren mit HTML

© 2003-2015 André Minhorst Alle Rechte vorbehalten.