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

  1. Abra un nuevo proyecto de aplicación Windows de Visual Basic y cree un formulario de nombre Form1.

  2. Agregue dos botones y una etiqueta a Form1.

  3. 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
  4. 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 clase Widget. Tenga en cuenta que un evento puede tener argumentos ByVal y ByRef, como muestra 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 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

  1. Para simplificar el acceso a la propiedad Timer usada por esta clase, agregue una instrucción Imports a la parte superior de la sección de declaraciones del módulo de la clase, encima de la instrucción Class Widget.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. 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.

Consulte también