Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
Coloque el código siguiente en
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanLa
WithEventspalabra clave especifica que la variablemWidgetse 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
mWidgetse declara enForm1porqueWithEventslas variables deben ser de nivel de clase. Esto es cierto independientemente del tipo de clase en el que los coloque.La variable
mblnCancelse usa para cancelar elLongTaskmé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
Seleccione
mWidgeten la lista desplegable izquierda en el Editor de código.Seleccione el
PercentDoneevento en la lista desplegable derecha. El Editor de código abre el procedimiento de eventosmWidget_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.
Agregue el código siguiente al controlador de
mWidget_PercentDoneeventos: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 SubCada vez que se genera el evento
PercentDone, el procedimiento de eventos muestra el porcentaje completo en un controlLabel. ElDoEventsmé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.Agregue el código siguiente para el controlador de
Button2_Clickeventos: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
Seleccione (Eventos de Form1) en la lista desplegable izquierda del Editor de código.
Seleccione el
Loadevento en la lista desplegable derecha. El Editor de código abre el procedimiento de eventosForm1_Load.Agregue el siguiente código para el procedimiento de evento
Form1_Loadpara crear elWidget: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_Clickeventos: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
Presione F5 para colocar el proyecto en modo de ejecución.
Haga clic en el botón Iniciar tarea . Cada vez que se genera el
PercentDoneevento, la etiqueta se actualiza con el porcentaje de la tarea que se completa.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
Clickevento no puede ocurrir hasta que la instrucciónMy.Application.DoEventspermita el procesamiento de eventos.Nota:
El
My.Application.DoEventsmé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_Clickprocedimiento, inmediatamente anterior a la línea que leemWidget.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.