Tutorial: Controlar eventos (Visual Basic)

Este es el segundo de dos temas que muestran cómo trabajar con eventos. El primer tema, Walkthrough: Declaring and Raising Events, muestra cómo declarar y generar eventos. En esta sección se usa el formulario y la clase de ese tutorial para mostrar cómo controlar los eventos cuando tienen lugar.

En Widget el ejemplo de clase se usan instrucciones tradicionales de control de eventos. Visual Basic proporciona otras técnicas para trabajar con eventos. Como ejercicio, puede modificar este ejemplo para usar las AddHandler Handles instrucciones y .

Para controlar el evento PercentDone de la clase Widget

  1. Coloque el código siguiente en Form1 :

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    La WithEvents palabra clave especifica que la variable se usa para controlar los eventos de un mWidget objeto. Especifique el tipo de objeto especificando el nombre de la clase a partir de la cual se creará el objeto.

    La variable mWidget se declara en porque las variables deben ser de nivel de Form1 WithEvents clase. Esto es así independientemente del tipo de clase en el que se coloquen.

    La variable mblnCancel se usa para cancelar el método LongTask .

Escribir código para controlar un evento

En cuanto se declara una variable mediante , el nombre de la variable aparece en la lista desplegable izquierda del WithEvents Editor de código de la clase. Al seleccionar mWidget , los eventos de la clase aparecen en la lista desplegable Widget derecha. Al seleccionar un evento se muestra el procedimiento de evento correspondiente, con el prefijo mWidget y un carácter de subrayado. Todos los procedimientos de evento asociados a WithEvents una variable reciben el nombre de la variable como prefijo.

Para controlar un evento

  1. Seleccione mWidget en la lista desplegable izquierda del Editor de código.

  2. Seleccione el PercentDone evento en la lista desplegable derecha. El Editor de código abre el procedimiento de mWidget_PercentDone evento.

    Nota

    El Editor de código es útil, pero no necesario, para insertar nuevos controladores de eventos. En este tutorial, es más directo simplemente copiar los controladores de eventos directamente en el código.

  3. Agregue el código siguiente al controlador de eventos mWidget_PercentDone :

    Private Sub mWidget_PercentDone(
        ByVal Percent As Single,
        ByRef Cancel As Boolean
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    Cada vez PercentDone que se genera el evento, el procedimiento de evento muestra el porcentaje completado en un control Label . El método permite que la etiqueta se vuelva a dibujar y también ofrece al usuario la oportunidad DoEvents de hacer clic en el botón Cancelar.

  4. Agregue el código siguiente para el controlador Button2_Click de eventos:

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Si el usuario hace clic en el botón Cancelar mientras se ejecuta, el evento se ejecuta en cuanto la instrucción permite que se produzca el procesamiento LongTask de Button2_Click DoEvents eventos. La variable de nivel de clase se establece en , y el evento la mblnCancel prueba y establece el argumento en True mWidget_PercentDone ByRef Cancel True .

Conexión de una variable WithEvents a un objeto

Form1 ahora está configurado para controlar los Widget eventos de un objeto. Lo único que queda es buscar un en Widget algún lugar.

Cuando se declara una variable WithEvents en tiempo de diseño, no se asocia ningún objeto a ella. Una WithEvents variable es igual que cualquier otra variable de objeto. Tiene que crear un objeto y asignarle una referencia con la WithEvents variable .

Para crear un objeto y asignarle una referencia

  1. Seleccione (Eventos de Form1) en la lista desplegable izquierda del Editor de código.

  2. Seleccione el Load evento en la lista desplegable derecha. El Editor de código abre el procedimiento de Form1_Load evento.

  3. Agregue el código siguiente para el Form1_Load procedimiento de evento para crear Widget :

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

Cuando se ejecuta este código, Visual Basic crea un objeto y conecta sus eventos a Widget los procedimientos de eventos asociados a mWidget . A partir de ese momento, cada vez que genera su evento, se ejecuta Widget el procedimiento de PercentDone mWidget_PercentDone evento.

Para llamar al método LongTask

  • Agregue el código siguiente al controlador de eventos Button1_Click :

    Private Sub Button1_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

Antes de llamar al método , se debe inicializar la etiqueta que muestra el porcentaje completado y la marca de nivel de clase para cancelar el método debe LongTask Boolean establecerse en False .

LongTask Se llama a con una duración de tarea de 12,2 segundos. El PercentDone evento se genera una vez cada un tercio de un segundo. Cada vez que se genera el evento, se mWidget_PercentDone ejecuta el procedimiento de evento.

Cuando LongTask haya terminado, mblnCancel se prueba para ver si LongTask finalizó con normalidad o si se detuvo porque mblnCancel se estableció en True . El porcentaje completado solo se actualiza en el caso anterior.

Para ejecutar el programa

  1. Presione F5 para poner el proyecto en modo de ejecución.

  2. Haga clic en el botón Iniciar tarea . Cada vez que PercentDone se genera el evento, la etiqueta se actualiza con el porcentaje de la tarea que se ha completado.

  3. Haga clic en el botón Cancelar para detener la tarea. Observe que la apariencia del botón Cancelar no cambia inmediatamente al hacer clic en él. El Click evento no puede producirse hasta que la instrucción permita el procesamiento de My.Application.DoEvents eventos.

    Nota

    El My.Application.DoEvents método no procesa eventos exactamente de la misma manera que lo hace el formulario. Por ejemplo, en este tutorial, debe hacer clic dos veces en el botón Cancelar. Para permitir que el formulario controle los eventos directamente, puede usar multithreading. Para obtener más información, vea Managed Threading.

Puede que le sea instructivo ejecutar el programa con F11 y pasar por el código una línea a la vez. Puede ver claramente cómo entra en ejecución y, a continuación, vuelve a entrar brevemente LongTask cada vez que se genera el Form1 PercentDone evento.

¿Qué ocurriría si, mientras la ejecución estaba de vuelta en el código de Form1 , se llamara de nuevo LongTask al método ? En el peor de los casos, podría producirse un desbordamiento de pila LongTask si se llamara cada vez que se generara el evento.

Puede hacer que la variable controle los eventos de un objeto diferente mediante la asignación de una referencia mWidget al nuevo a Widget Widget mWidget . De hecho, puede hacer que el código de Button1_Click haga esto cada vez que haga clic en el botón.

Para controlar eventos de un widget diferente

  • Agregue la siguiente línea de código al Button1_Click procedimiento, inmediatamente antes de la línea que dice mWidget.LongTask(12.2, 0.33) :

    mWidget = New Widget
    ' Create a new Widget object.
    

El código anterior crea un nuevo Widget cada vez que se hace clic en el botón. En cuanto se completa el método, se libera la referencia a y LongTask Widget se destruye Widget .

Una variable solo puede contener una referencia de objeto a la vez, por lo que si asigna un objeto diferente a , los eventos del objeto WithEvents anterior ya no se Widget mWidget Widget controlarán. Si mWidget es la única variable de objeto que contiene una referencia a la antigua , el objeto se Widget destruye. Si desea controlar eventos de varios objetos, use la instrucción para Widget procesar eventos de cada objeto por AddHandler separado.

Nota

Puede declarar tantas variables como necesite, pero no se admiten WithEvents matrices WithEvents de variables.

Consulta también