Corrigiendo un… problema de diseño con un evento

Si ya me lo decían: “no vayas a Z’ha’dum“. Pero yo, ni caso. Me puse a hacer una interfaz MDI tan ricamente para la aplicación de fábrica sin pensarlo con detenimiento (eso también me lo decían, en este caso Coco y Barrio Sésamo, lo de “tienes que planificar”, pero, igualmente, ni caso) y ahora me encuentro con lo normal: mucho impedirle cambiar de registro cuando está modificando una pieza, por ejemplo, pero nada le impide irse a otro formulario a trastear allí. Y, como es un luser, lo hará. O sea, que me pueden coger en un renuncio (error de concurrencia en el mejor de los casos) sin necesidad de tener dos lusers, con uno me basta y sobra.

Vale, que no cunda el pánico. Pensemos. O cubro bien todas las posibilidades o me curo en salud y no le dejo tocar al usuario donde no deba. Como soy alumno de mi profe, he optado por lo segundo. Así que quiero que cuando el luser quiera modificar o dar de alta “algo” en uno de los formularios, todos los demás se hagan los suecos (disabled). Pregunta: ¿cómo lo hago?

Bien, resulta que, ¡oh, casualidad!, casi todos los formularios derivan de un formulario plantilla (cuestión de vagancia), así que se me ocurrió usar un evento compartido en la clase base. El evento se provocará cada vez que cambie el “estado” del formulario, por ejemplo, al pulsar el botón de Nuevo o el de Aceptar. Necesito también saber, cuando salte el evento, si ha sido porque he entrado en un modo “modificar datos” o en un modo “ver datos”, así que necesito un argumento booleano que me lo controle. Vale, al trabajo.

Empezamos definiendo el tipo de argumentos para el evento. He dicho que necesito un booleano, pero para hacerlo “según las normas” he definido una clase ModificandoEventArgs que hereda de EventArgs y que, de momento, lo único que tiene importante es una propiedad booleana.

Public Class ModificandoEventArgs
    Inherits EventArgs
    Private _EstoyModificando As Boolean

    Public Sub New(ByVal estamosModificando As Boolean)
        Me._EstoyModificando = estamosModificando
    End Sub

    Public ReadOnly Property EstamosModificando() As Boolean
        Get
            Return Me._EstoyModificando
        End Get
    End Property
End Class

Luego declaramos el delegado:

Public Delegate Sub ModificandoEventHandler(ByVal sender As Object, _
    ByVal e As ModificandoEventArgs)

Y, ya por fin, el evento y el método que lo lanza:

Public Shared Event Modificando As ModificandoEventHandler

Protected Overridable Sub OnModificando(ByVal e As ModificandoEventArgs)
    RaiseEvent Modificando(Me, e)
End Sub

Ya de paso me creo un método para gestionar este evento dentro de la clase base, a ver qué pasa.

Protected Overridable Sub EstamosModificando(ByVal sender As Object, _
    ByVal e As ModificandoEventArgs) Handles Me.Modificando
    If sender IsNot Me Then
        Me.Enabled = Not e.EstamosModificando
    End If
End Sub

Ya está. ¡Ah, no! Falta lanzar el evento. Pues nada, llamadita a OnModificando desde el lugar apropiado, concretamente desde el método PrepararForm que se ejecuta en cada cambio de estado del formulario. Y funciona. A la primera. Ya no me acuerdo cuándo fue la última vez que me funcionó algo a la primera.

Deja un comentario