Compartir a través de


Tutorial: Control de eventos (Visual Basic)

Se trata del segundo de los temas que abordan cómo trabajar con eventos. El primer tema, Tutorial: Declarar y generar eventos, 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 el ejemplo de la clase Widget se usan declaraciones tradicionales de manejo de eventos. Visual Basic proporciona otras técnicas para trabajar con eventos. Como ejercicio, puede modificar este ejemplo para usar las instrucciones AddHandler y Handles .

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 mWidget se usa para controlar los eventos de un objeto. Especifique el tipo de objeto proporcionando el nombre de la clase a partir de la cual se creará el objeto.

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

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

Escribir código para controlar un evento

En cuanto declare una variable mediante WithEvents, el nombre de la variable aparece en la lista desplegable izquierda del Editor de código de la clase. Al seleccionar mWidget, los eventos de la Widget clase aparecen en la lista desplegable 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 una WithEvents variable reciben el nombre de la variable como prefijo.

Para controlar un evento

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

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

    Nota:

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

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

    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 que se genera el evento PercentDone, el procedimiento de eventos muestra el porcentaje completo en un control Label. El DoEvents método permite que la etiqueta se vuelva a pintar y también le da al usuario la posibilidad de hacer clic en el botón Cancelar.

  4. Agregue el código siguiente para el controlador de Button2_Click 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 LongTask se ejecuta, el Button2_Click evento se ejecuta en cuanto la DoEvents instrucción permite que se produzca el procesamiento de eventos. La variable mblnCancel de nivel de clase se establece en True, y luego el evento mWidget_PercentDone lo prueba y establece el argumento ByRef Cancel en True.

Conexión de una variable WithEvents a un objeto

Form1 ahora está configurado para controlar los eventos de un Widget objeto. Solo queda encontrar un Widget en algún sitio.

Al declarar una variable WithEvents en tiempo de diseño, no hay ningún objeto asociado 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 eventos Form1_Load.

  3. Agregue el siguiente código para el procedimiento de evento Form1_Load para crear el 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 Widget objeto y conecta sus eventos a los procedimientos de evento asociados a mWidget. Desde ese punto, siempre que Widget genere su evento PercentDone, se ejecuta el procedimiento del evento mWidget_PercentDone.

Cómo llamar al método LongTask

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

    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 LongTask método, la etiqueta que muestra el porcentaje completado debe inicializarse y la marca de nivel de clase Boolean para cancelar el método debe establecerse en False.

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

Cuando LongTask se realiza, mblnCancel se prueba para ver si LongTask finalizó normalmente 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 colocar el proyecto en modo de ejecución.

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

  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 ocurrir hasta que la instrucción My.Application.DoEvents permita el procesamiento de 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 en el botón Cancelar dos veces. Para permitir que el formulario controle directamente los eventos, puede usar multithreading. Para obtener más información, consulte Managed Threading.

Es posible que le indique que ejecute el programa con F11 y recorra el código una línea a la vez. Puede ver claramente cómo la ejecución entra en LongTask y, a continuación, vuelve a entrar brevemente en Form1 cada vez que se genera el evento PercentDone.

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

Puede hacer que la variable mWidget controle los eventos de un objeto diferente Widget asignando una referencia al nuevo Widget a mWidget. De hecho, puede hacer que el código 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 anterior a la línea que lee 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. Tan pronto como se complete el LongTask método, se libera la referencia a Widget y Widget se destruye .

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

Nota:

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

Consulte también