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.