Tutorial: Declarar y provocar 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 quiera leer el tema complementario Tutorial:Controlar eventos , que muestra cómo usar eventos de objetos para proporcionar información de estado en Widget una aplicación.

La clase Widget

Supongamos por el momento que tiene una Widget clase. La clase tiene un método que puede tardar mucho tiempo en ejecutarse y desea que la aplicación pueda colocar algún tipo Widget de indicador de finalización.

Por supuesto, podría hacer que el objeto mostrara un cuadro de diálogo de porcentaje completo, pero luego se quedaría atascado con ese cuadro de diálogo en todos los proyectos en los que Widget usó la Widget clase . 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 un cuadro de diálogo.

El propósito de es realizar otras tareas, por lo que es mejor agregar un evento y permitir que el procedimiento que llama a los métodos de controle ese evento y muestre las actualizaciones Widget PercentDone de Widget 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 Visual Basic Windows application y cree un formulario denominado 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 Project, elija Agregar clase para agregar una clase Widget.vb denominada al proyecto.

Para declarar un evento para la clase Widget

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

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

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

Nota

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

El método de la PercentDone clase genera el evento LongTask Widget . LongTask toma dos argumentos: el tiempo durante el que el método pretende realizar el trabajo y el intervalo de tiempo mínimo antes de LongTask pausar para generar el PercentDone evento.

Para generar el evento PercentDone

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

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

Aquí se necesita unas cuantas declinaciones de responsabilidades. Por motivos de simplicidad, LongTask el procedimiento supone que conoce de antemano cuánto tiempo llevará la tarea. Este es casi nunca el caso. Dividir 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 transcurre antes de que obtengan una indicación de que algo está ocurriendo.

Es posible que haya detectado otro error en este ejemplo. La propiedad devuelve el número de segundos transcurridos desde la medianoche; por lo tanto, la aplicación se queda bloqueada si se inicia justo antes Timer de medianoche. Un enfoque más cuidadoso para medir el tiempo tendría en cuenta condiciones límite como esta o las evitaría por completo mediante propiedades como Now .

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

Consulta también