Saltar navegación

Documentación de FlexPro 2025

Procesar eventos

Este ejemplo muestra cómo puede interceptar eventos en sus programas Basic y reaccionar ante ellos. El código del programa y los objetos de FlexPro necesarios se encuentran en la base de datos Events.fpd. El nombre de ruta de la base de datos del proyecto es normalmente C:\Users\Public\Documents\Weisang\FlexPro\2025\Examples\VBA\Events\Events.fpd o C:>Usuario>Acceso público>Documentos públicos>Weisang>FlexPro>2025>Examples>VBA>Events>Events.fpd. Esta base de datos contiene un diagrama con dos ejes X. Los valores X de la curva se escalan por encima del eje inferior; en el ejemplo, se trata de un tramo en la unidad km. El segundo eje, que se muestra en la parte superior del diagrama, asigna nombres a determinadas posiciones de ese tramo. En el ejemplo, los nombres de las ciudades a lo largo del tramo. Se crearon dos series de datos para escalar este eje. La serie de datos Cities contiene los nombres de las ciudades y la serie de datos Positions, sus posiciones a lo largo del tramo. Para etiquetar el eje con estos datos, se seleccionó el tipo de eje Lineal, división por conjunto de datos en la pestaña Escalado y se introdujo la serie de datos Positions como conjunto de datos. Determina las posiciones en las que deben aparecer las divisiones de ejes. En la pestaña Etiquetado de divisiones se ha activado la opción Etiquetado de divisiones mediante una serie de datos, señal o función y se ha introducido Cities como conjunto de datos. A partir de la versión 7 de FlexPro, puede sincronizar fácilmente los valores finales del eje de este segundo eje X con el primero configurando la escala para los valores inicial y final como Igual que el eje anterior en la pestaña Escalado. Este eje no se puede autoescalar, ya que no se muestra ninguna curva sobre él.

El siguiente ejemplo, desarrollado originalmente para FlexPro 6, muestra cómo los valores finales del segundo eje pueden sincronizarse con el primero mediante el procesamiento de eventos. Los requisitos son los siguientes:

Debe garantizarse que el procesamiento de eventos se active al abrir la base de datos y se restablezca a su estado anterior al cerrarla.

Al abrir el diagrama, asegúrese de que el segundo eje está ajustado a escala fija y se adoptan los valores finales actuales del primer eje.

Al aplicar el zoom utilizando los cursores, hay que asegurarse de que los nuevos valores finales del primer eje X se transfieren al segundo.

Activación del procesamiento de eventos

Esta tarea puede resolverse implementando las dos macros automáticas AutoOpen y AutoClose. Para ello, el módulo AutoMacros contiene el siguiente código:

Private bEnableEvents As Boolean

 

Sub AutoOpen()

    bEnableEvents = Application.EnableEvents

    Application.EnableEvents = True

End Sub

 

Sub AutoClose()

    Application.EnableEvents = bEnableEvents

End Sub

 

El estado actual de la propiedad EnableEvents del objeto Application se guarda en AutoOpen y, a continuación, se activa el procesamiento de eventos.

El estado previamente guardado se restaura en AutoClose.

Inicializar la escala del eje

Esta tarea se resuelve mediante un procedimiento de eventos que procesa el evento BeforeOpenObject, que es enviado por cada objeto FlexPro antes de su apertura. En el VbaProject de Events.fpd hay un objeto correspondiente AnyFpObject, que representa todos los objetos de FlexPro de la base de datos y, por lo tanto, recibe todos los eventos que son comunes a todos los objetos de FlexPro. El siguiente código se asigna a este objeto de clase:

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

 

La consulta If comprueba si se trata del diagrama 2D correcto. El nombre, la ruta en la base de datos y la extensión del nombre de los diagramas 2D deben coincidir. El procedimiento de eventos recibe este evento cuando se abre cualquier objeto de la base de datos, por ejemplo, otro diagrama 2D o un conjunto de datos. Dentro de la consulta If, está claro que se trata de un diagrama 2D y, por tanto, el objeto indefinido puede asignarse a una variable de tipo Diagram2D. Los siguientes pasos son fáciles de seguir. En primer lugar, asegúrese de que los valores inicial y final están ajustados a escalado fijo. A continuación, se adoptan los valores inicial y final actuales del primer eje. Para un eje autoescalado, las propiedades CurrentStartValue y CurrentEndValue proporcionan los valores resultantes del autoescalado, y no los valores introducidos en la pestaña Escalado y desactivados en este caso.

Adopción de los valores finales de los ejes tras operaciones de zoom

Aquí debe manejarse un gran número de eventos, ya que varias operaciones cambian los valores finales de los ejes. Por ejemplo, puede aplicar el zoom entre los cursores, ampliar un área rectangular o desplazar el eje. Todos estos eventos solo se aplican a los objetos de cursor, es decir, a los objetos que pueden contener cursores. Esto es, diagramas, planillas y documentos. El objeto de clase AnyCursorObject, que recibe todos los eventos de cursor, se asigna a los objetos de cursor. Contiene el siguiente código:

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 es un procedimiento auxiliar al que llaman los distintos procedimientos de eventos. También en este caso se comprueba primero que el objeto que se va a editar esté disponible y, a continuación, se copian los nuevos valores finales de los ejes. Se implementaron todos los procedimientos de eventos cuyos eventos influyen en el escalado del eje y se seleccionaron aquellos eventos que se envían después de la operación correspondiente para que los valores finales del primer eje X ya tengan los nuevos valores.