Tutorial: Declarar y provocar eventos (Visual Basic)
En este tutorial se muestra cómo declarar y generar eventos para una clase de nombre Widget
. Después de completar los pasos, es posible que quiera leer el tema complementario Tutorial: Controlar eventos, donde se muestra cómo usar eventos de objetos Widget
para proporcionar información de estado en una aplicación.
La clase Widget
Imagine en este momento que tiene una clase Widget
. La clase Widget
tiene un método que puede tardar mucho tiempo en ejecutarse, así que quiere que la aplicación pueda mostrar algún tipo de indicador de finalización.
Por supuesto, podría hacer que el objeto Widget
mostrara un cuadro de diálogo de porcentaje completado, pero después tendría que aguantar ese cuadro de diálogo en cada proyecto en el que usara la clase Widget
. Un buen principio de diseño de objetos es permitir que la aplicación que usa un objeto controle la interfaz de usuario, a menos que el único propósito del objeto sea administrar un formulario o un cuadro de diálogo.
El propósito de Widget
es realizar otras tareas, por lo que es mejor agregar un evento PercentDone
y dejar que el procedimiento que llama a los métodos de Widget
controle ese evento y muestre las actualizaciones de estado. El evento PercentDone
también puede proporcionar un mecanismo para cancelar la tarea.
Para compilar el ejemplo de código de este tema
Abra un nuevo proyecto de aplicación Windows de Visual Basic y cree un formulario de nombre
Form1
.Agregue dos botones y una etiqueta a
Form1
.Asigne nombre a los objetos tal y como se muestra en la tabla siguiente.
Object Propiedad Parámetro Button1
Text
Tarea de inicio Button2
Text
Cancelar Label
(Name)
,Text
lblPercentDone, 0 En el menú Proyecto, elija Agregar clase para agregar una clase de nombre
Widget.vb
al proyecto.
Para declarar un evento para la clase Widget
Use la palabra clave
Event
para declarar un evento en la claseWidget
. Tenga en cuenta que un evento puede tener argumentosByVal
yByRef
, como muestra el eventoPercentDone
deWidget
: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 completado. El argumento Cancel
se puede establecer en True
para cancelar el método que ha generado el evento.
Nota
Puede declarar argumentos de eventos del mismo modo que declara argumentos de procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos Optional
o ParamArray
, y los eventos no tienen valores devueltos.
El evento PercentDone
se genera mediante el método LongTask
de la clase Widget
. LongTask
toma dos argumentos: el período de tiempo que el método pretende estar realizando el trabajo y el intervalo de tiempo mínimo antes de que LongTask
se pause para generar el evento PercentDone
.
Para generar el evento PercentDone
Para simplificar el acceso a la propiedad
Timer
usada por esta clase, agregue una instrucciónImports
a la parte superior de la sección de declaraciones del módulo de la clase, encima de la instrucciónClass Widget
.Imports Microsoft.VisualBasic.DateAndTime
Agregue el siguiente código 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 la aplicación llama al método LongTask
, la clase Widget
genera el evento PercentDone
cada MinimumInterval
segundos. Cuando se devuelve el evento, LongTask
comprueba si el argumento Cancel
se ha establecido en True
.
Aquí se necesitan algunas declinaciones de responsabilidades. Para simplificar, el procedimiento LongTask
da por hecho que sabe con antelación cuánto va a tardar la tarea. Este casi nunca es el caso. Dividir las tareas en fragmentos de tamaño uniforme puede ser difícil y, a menudo, lo que más importa a los usuarios es simplemente la cantidad de tiempo que pasa antes de obtener una indicación de que algo está sucediendo.
Es posible que haya detectado otro defecto en este ejemplo. La propiedad Timer
devuelve el número de segundos que han transcurrido desde medianoche; por lo tanto, la aplicación se bloquea si se inicia justo antes de medianoche. Un enfoque más cuidadoso para medir el tiempo tomaría en consideración condiciones de límite como esta, o las evitaría por completo, mediante propiedades como Now
.
Ahora que la clase Widget
puede generar eventos, puede pasar al siguiente tutorial. Tutorial: Controlar eventos muestra cómo usar WithEvents
para asociar un controlador de eventos al evento PercentDone
.