Ereignisse verarbeiten

23.04.2021

Dieses Beispiel zeigt, wie Sie in Ihren Basic-Programmen Ereignisse abfangen und darauf reagieren können. Den Programmcode und die benötigten FlexPro-Objekte finden Sie in der Datenbank Events.fpd. Der Pfadname der Projektdatenbank lautet normalerweise C:\Users\Public\Documents\Weisang\FlexPro\2021\Examples\VBA\Events\Events.fpd bzw. C:>Benutzer>Öffentlich>Öffentliche Dokumente>Weisang>FlexPro>2021>Examples>VBA>Events>Events.fpd. In dieser Datenbank befindet sich ein Diagramm mit zwei X-Achsen. Über der unteren Achse werden die X-Werte des Kurvenzuges skaliert, im Beispiel handelt es sich um eine Wegstrecke in der Einheit km. Die zweite Achse, die am oberen Rand des Diagramms dargestellt wird, ordnet bestimmten Positionen dieser Wegstrecke Namen zu. Im Beispiel die Namen von Städten, die entlang der Wegstrecke liegen. Zur Skalierung dieser Achse wurden zwei Datenreihen angelegt. Die Datenreihe Cities enthält die Städtenamen und die Datenreihe Positions deren Positionen entlang der Wegstrecke. Um die Achse mit diesen Daten zu beschriften, wurde auf der Registerkarte Achsenskalierung die Achsenart Linear, Teilung über Datensatz ausgewählt und die Datenreihe Positions als Datensatz eingetragen. Diese bestimmt somit die Positionen, an denen Achsenteilungen erscheinen sollen. Auf der Registerkarte Teilungsbeschriftung wurde die Option Teilungsbeschriftung über Datenreihe, Signal oder Funktion aktiviert und Cities als Datensatz eingetragen. Die Achsenendwerte dieser zweiten X-Achse können Sie ab Version 7 von FlexPro ganz einfach mit der ersten synchronisieren, indem Sie auf der Registerkarte Achsenskalierung die Skalierung für Anfangs- und Endwert auf Gleicher wie vorige Achse stellen. Diese Achse kann nämlich nicht autoskaliert werden, da über ihr kein Kurvenzug dargestellt wird.

Folgendes Beispiel, welches ursprünglich für FlexPro 6 entwickelt wurde, zeigt, wie die Endwerte der zweiten Achse über Ereignisverarbeitung mit der ersten synchronisiert werden können. Es ergeben sich folgende Anforderungen:

Es muss sichergestellt werden, dass beim Öffnen der Datenbank die Ereignisverarbeitung aktiviert wird und beim Schließen derselben wieder in Ihren vorherigen Status zurückgesetzt wird.

Beim Öffnen des Diagramms muss sichergestellt werden, dass die zweite Achse auf Festskalierung steht und dass die aktuellen Endwerte der ersten Achse übernommen werden.

Bei Zoomoperationen mittels der Cursor muss sichergestellt werden, dass die jeweils neuen Endwerte der ersten X-Achse in die zweite übernommen werden.

Aktivierung der Ereignisverarbeitung

Diese Aufgabe kann durch Implementierung der beiden Auto-Makros AutoOpen und AutoClose gelöst werden. Im Modul AutoMacros befindet sich hierzu folgender Code:

Private bEnableEvents As Boolean

 

Sub AutoOpen()

    bEnableEvents = Application.EnableEvents

    Application.EnableEvents = True

End Sub

 

Sub AutoClose()

    Application.EnableEvents = bEnableEvents

End Sub

 

In AutoOpen wird der aktuelle Zustand der EnableEvents-Eigenschaft des Application-Objektes gespeichert und anschließend wird die Ereignisverarbeitung aktiviert.

In AutoClose wird der zuvor gespeicherte Zustand wiederhergestellt.

Initialisierung der Achsenskalierung

Diese Aufgabe wird durch eine Ereignisprozedur gelöst, die das Ereignis BeforeOpenObject behandelt, welches von jedem FlexPro-Objekt vor dem Öffnen gesendet wird. Im VbaProject von Events.fpd befindet sich ein entsprechendes Objekt AnyFpObject, welches alle FlexPro-Objekte der Datenbank repräsentiert und daher alle solche Ereignisse empfängt, die allen FlexPro-Objekten gemeinsam sind. Diesem Klassenobjekt ist der folgende Code zugeordnet:

Private Sub FpObjectClass_BeforeOpenObject(ByVal Object As Object)

    Dim oDiag As Diagram2D

    If Object.FullName = "\Route.2D" Then

        Set oDiag = Object

        oDiag.XAxes(2).Scaling.ModeStartValue = fpAxisScalingModeFixed

        oDiag.XAxes(2).Scaling.ModeEndValue = fpAxisScalingModeFixed

        oDiag.XAxes(2).Scaling.StartValue = oDiag.XAxes(1).Scaling.CurrentStartValue

        oDiag.XAxes(2).Scaling.EndValue = oDiag.XAxes(1).Scaling.CurrentEndValue

    End If

End Sub

 

In der If-Abfrage wird geprüft, ob es sich um das korrekte 2D-Diagramm handelt. Name, Pfad in der Datenbank und die Namenserweiterung für 2D-Diagramme müssen übereinstimmen. Die Ereignisprozedur empfängt dieses Ereignis nämlich beim Öffnen eines beliebigen Objektes in der Datenbank, z. B. eines anderen 2D-Diagramms oder eines Datensatzes. Innerhalb der If-Abfrage ist klar, dass es sich um ein 2D-Diagramm handelt und das unbestimmte Objekt kann daher einer Variablen vom Typ Diagram2D zugewiesen werden. Die folgenden Schritte sind einfach nachzuvollziehen. Zunächst wird sichergestellt, dass Start- und Endwert auf Festskalierung stehen. Dann werden die aktuellen Start- und Endwerte der ersten Achse übernommen. Die Eigenschaften CurrentStartValue und CurrentEndValue liefern bei einer autoskalierten Achse die sich aus der Autoskalierung ergebenden Werte und nicht die auf der Registerkarte Achsenskalierung der Achse eingetragenen und in diesem Fall deaktivierten Werte.

Übernehmen der Achsenendwerte nach Zoom-Operationen

Hier muss nun eine Vielzahl von Ereignissen behandelt werden, da mehrere Operationen die Achsenendwerte verändern. Sie können z. B. zwischen den Cursor zoomen, einen rechteckigen Bereich zoomen oder die Achse scrollen. Alle diese Ereignisse treffen nur auf Cursorobjekte zu, d. h. Objekte, die Cursor enthalten können. Dies sind Diagramme, Arbeitsblätter und Dokumente. Den Cursorobjekten ist das Klassenobjekt AnyCursorObject zugeordnet, welches alle Cursor-Ereignisse empfängt. Es enthält folgenden Code:

Private Sub AdaptScaling(Object As CursorObject)

    Dim oDiag As Diagram2D

    If Object.FullName = "\Route.2D" Then

        Set oDiag = Object

        oDiag.XAxes(2).Scaling.StartValue = oDiag.XAxes(1).Scaling.CurrentStartValue

        oDiag.XAxes(2).Scaling.EndValue = oDiag.XAxes(1).Scaling.CurrentEndValue

    End If

End Sub

 

Private Sub CursorObjectClass_AxisScaled(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

 

Private Sub CursorObjectClass_AxisScrolled(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

 

Private Sub CursorObjectClass_RectangleZoomed(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

 

Private Sub CursorObjectClass_ZoomedBetweenCursors(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

 

Private Sub CursorObjectClass_ZoomReset(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

 

Private Sub CursorObjectClass_ZoomUndone(ByVal CursorObject As Object)

    AdaptScaling CursorObject

End Sub

AdaptScaling ist eine Hilfsprozedur, welche von den verschiedenen Ereignisprozeduren aufgerufen wird. Auch hier wird zunächst sichergestellt, dass das zu bearbeitende Objekt vorliegt und dann werden die neuen Achsenendwerte kopiert. Es wurden alle Ereignisprozeduren implementiert, deren Ereignisse Einfluss auf die Achsenskalierung haben und es wurden jene Ereignisse ausgewählt, die nach der entsprechenden Operation gesendet werden, so dass die Achsenendwerte der ersten X-Achse bereits die jeweils neuen Werte aufweisen.

Artikel teilen oder als Email versenden:

Diese Beiträge könnten Sie ebenfalls interessieren