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 Boolean
La
WithEvents
palabra clave especifica que la variablemWidget
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 enForm1
porqueWithEvents
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 elLongTask
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
Seleccione
mWidget
en la lista desplegable izquierda en el Editor de código.Seleccione el
PercentDone
evento 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_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 controlLabel
. ElDoEvents
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.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
Seleccione (Eventos de Form1) en la lista desplegable izquierda del Editor de código.
Seleccione el
Load
evento 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_Load
para 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_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
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
PercentDone
evento, 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
Click
evento no puede ocurrir hasta que la instrucciónMy.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 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.