Share via


Tutorial: Declarar y provocar eventos

Actualización: noviembre 2007

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, 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

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

  2. Agregue dos botones y una etiqueta a Form1.

  3. Dé nombre a los objetos como se muestra en la tabla siguiente.

    Objeto

    Propiedad

    Ajuste

    Button1

    Text

    Start Task

    Button2

    Text

    Cancelar

    Label

    (Name), Text

    lblPercentDone, 0

  4. 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 evento PercentDone lo produce el método LongTask de la clase Widget. LongTask acepta dos argumentos: el período de tiempo durante el cual el método simulará trabajar y el intervalo de tiempo mínimo antes de que LongTask se detenga para provocar el evento PercentDone.

Para provocar el evento PercentDone

  1. 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
    
  2. 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 provocar eventos, puede continuar con el siguiente tutorial. Tutorial: Controlar eventos explica cómo utilizar WithEvents para asociar un controlador de eventos con el evento PercentDone.

Vea también

Tareas

Tutorial: Controlar eventos

Cómo: Escribir controladores de eventos

Conceptos

Eventos y controladores de eventos

Los delegados y el operador AddressOf

AddHandler y RemoveHandler

Referencia

Timer (Propiedad)

WithEvents

Now (Propiedad)

Event (Instrucción)

ByVal

ByRef

Instrucción Imports (Tipo y espacio de nombres de .NET)