Tutorial: Declarar y provocar eventos (Visual Basic)
Este tutorial explica cómo declarar y provocar eventos para una clase denominada Widget. Cuando finalice los pasos tal vez desee leer el tema complementario, Tutorial: Controlar eventos (Visual Basic), que muestra cómo utilizar eventos de objetos Widget para proporcionar información de estado en una aplicación.
La clase Widget
Suponga por el momento que tiene una clase Widget. Su clase Widget tiene un método que puede tardar bastante tiempo en ejecutarse, y desea que la aplicación pueda establecer alguna clase de indicador de finalización.
Por supuesto, podría hacer que el objeto Widget mostrara un cuadro de diálogo de porcentaje finalizado, pero entonces ese cuadro de diálogo aparecería en cada proyecto en el que utilizase la clase Widget. Un buen principio del diseño de objetos consiste en dejar que la aplicación que utiliza un objeto controle la interfaz de usuario, a no ser que el objeto tenga como única finalidad administrar un formulario o un cuadro de diálogo.
La finalidad de Widget es realizar otras tareas, de modo que es mejor agregar un evento PercentDone y dejar que el procedimiento que llama a los métodos de Widget lo controle y muestre las actualizaciones del estado. El evento PercentDone también puede proporcionar un mecanismo para cancelar la tarea.
Para generar el ejemplo de código para este tema
Abra un nuevo proyecto de aplicación para Windows de Visual Basic y cree un formulario llamado Form1.
Agregue dos botones y una etiqueta a Form1.
Dé nombre a los objetos como se muestra en la tabla siguiente.
Objeto
Propiedad
Valor
Button1
Text
Iniciar tarea
Button2
Text
Cancelar
Label
(Name), Text
lblPercentDone, 0
En el menú Proyecto, elija Agregar clase para agregar al proyecto una clase denominada Widget.vb.
Para declarar un evento para la clase Widget
Utilice la palabra clave Event para declarar un evento en la clase Widget. Observe que un evento puede tener argumentos ByVal y ByRef, como se puede ver en el evento PercentDone de Widget:
Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
Cuando el objeto de llamada recibe un evento PercentDone, el argumento Percent contiene el porcentaje de la tarea que se ha finalizado. El argumento Cancel se puede establecer en True para cancelar el método que provocó el evento.
Nota
Los argumentos de eventos se pueden declarar igual que se hace con los argumentos de procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos Optional, ParamArray, ni valores devueltos.
El método LongTask de la clase Widget genera el evento PercentDone. LongTask toma dos argumentos: el período de tiempo durante el cual el método va a trabajar y el intervalo de tiempo mínimo antes de que LongTask pause para generar el evento PercentDone.
Para provocar el evento PercentDone
Para simplificar el acceso a la propiedad Timer utilizada por esta clase, agregue una instrucción Imports a la parte superior de la sección de declaraciones del módulo de clase, por encima de la instrucción Class Widget.
Imports Microsoft.VisualBasic.DateAndTime
Agregue el código siguiente a la clase Widget:
Public Sub LongTask(ByVal Duration As Single, ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
Cuando su aplicación llama al método LongTask, la clase Widget provoca el evento PercentDone cada vez que transcurran los especificados en MinimumInterval. Cuando se vuelve del evento, LongTask comprueba si se estableció en True el argumento Cancel.
En este punto son necesarias algunas aclaraciones. Para simplificar, en el procedimiento LongTask se supone que el usuario conoce de antemano cuánto tarda en realizarse la tarea. Esto casi nunca es así. Dividir las tareas en bloques del mismo tamaño puede resultar difícil y, a menudo, lo que es más importante para los usuarios es simplemente el tiempo que transcurre antes de recibir una indicación de que algo está ocurriendo.
También puede haber detectado otro error en este ejemplo. La propiedad Timer devuelve el número de segundos transcurridos desde medianoche; por lo tanto, la aplicación se bloquea si se inicia inmediatamente antes de medianoche. Una forma más cuidadosa de medir el tiempo tendría en cuenta condiciones de límite como ésta, o las evitaría globalmente utilizando propiedades como Now.
Ahora que la clase Widget puede generar eventos, puede pasar al siguiente tutorial. En Tutorial: Controlar eventos (Visual Basic), se muestra cómo utilizar WithEvents para asociar un controlador de eventos al evento PercentDone.
Vea también
Tareas
Tutorial: Controlar eventos (Visual Basic)