Compartir a través de


Tutorial: Declarar y generar eventos (Visual Basic)

En este tutorial se muestra cómo declarar y generar eventos para una clase denominada Widget. Después de completar los pasos, es posible que desee leer el tema complementario Tutorial: Controlar eventos, que muestra cómo usar eventos de Widget objetos para proporcionar información de estado en una aplicación.

La clase widget

Imagine en este momento que tiene una clase Widget. La Widget clase tiene un método que puede tardar mucho tiempo en ejecutarse y quiere que la aplicación pueda poner 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 todo el propósito del objeto sea administrar un formulario o cuadro de diálogo.

El propósito de Widget es realizar otras tareas, por lo que es mejor agregar un PercentDone evento y dejar que el procedimiento que llama a los métodos de las llamadas Widgetcontrole ese evento y muestre las actualizaciones de estado. El PercentDone evento también puede proporcionar un mecanismo para cancelar la tarea.

Para compilar el ejemplo de código para este tema

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

  2. Agregue dos botones y una etiqueta a Form1.

  3. Asigne un nombre a los objetos como se muestra en la tabla siguiente.

    Objeto Propiedad Configuración
    Button1 Text Iniciar tarea
    Button2 Text Cancelar
    Label (Name), Text lblPercentDone, 0
  4. En el menú Proyecto , elija Agregar clase para agregar una clase denominada Widget.vb al proyecto.

Para declarar un evento para la clase Widget

  • Use la Event palabra clave para declarar un evento en la Widget clase . Tenga en cuenta que un evento puede tener ByVal y ByRef argumentos, como demuestra el evento Widget de PercentDone.

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

Cuando el objeto que realiza la llamada recibe un PercentDone evento, el Percent argumento contiene el porcentaje de la tarea que se ha completado. El Cancel argumento se puede establecer en True para cancelar el método que generó el evento.

Nota:

Puede declarar argumentos de evento igual que argumentos de procedimientos, con las siguientes excepciones: Los eventos no pueden tener Optional argumentos o ParamArray y los eventos no tienen valores devueltos.

El PercentDone evento se genera mediante el LongTask método de la Widget clase . LongTask toma dos argumentos: el período de tiempo que el método pretende trabajar y el intervalo de tiempo mínimo antes de que LongTask pause para generar el evento PercentDone.

Para generar el evento PercentDone

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

    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 LongTask método , la Widget clase genera el PercentDone evento cada MinimumInterval segundos. Cuando el evento vuelve, LongTask comprueba si el argumento Cancel se estableció en True.

Aquí se necesitan algunos avisos de declinación de responsabilidades. Por motivos de simplicidad, el LongTask procedimiento supone que sabe con antelación cuánto tardará la tarea. Esto casi nunca es el caso. Dividir las tareas en fragmentos de tamaño par 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 error en este ejemplo. La Timer propiedad devuelve el número de segundos que han pasado desde la 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 las condiciones de límite, como esta, o evitarlas por completo, mediante propiedades como Now.

Ahora que la Widget clase puede generar eventos, puede pasar al siguiente tutorial. Tutorial: Controlar eventos muestra cómo usar WithEvents para asociar un controlador de eventos al PercentDone evento.

Consulte también