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
Coloque el código siguiente en
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanLa
WithEventspalabra clave especifica que la variable se usa para controlar los eventos de unmWidgetobjeto. Especifique el tipo de objeto especificando el nombre de la clase a partir de la cual se creará el objeto.La variable
mWidgetse declara en porque las variables deben ser de nivel deForm1WithEventsclase. Esto es así independientemente del tipo de clase en el que se coloquen.La variable
mblnCancelse usa para cancelar el métodoLongTask.
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
Seleccione
mWidgeten la lista desplegable izquierda del Editor de código.Seleccione el
PercentDoneevento en la lista desplegable derecha. El Editor de código abre el procedimiento demWidget_PercentDoneevento.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.
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 SubCada vez
PercentDoneque se genera el evento, el procedimiento de evento muestra el porcentaje completado en un controlLabel. El método permite que la etiqueta se vuelva a dibujar y también ofrece al usuario la oportunidadDoEventsde hacer clic en el botón Cancelar.Agregue el código siguiente para el controlador
Button2_Clickde 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
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 deForm1_Loadevento.Agregue el código siguiente para el
Form1_Loadprocedimiento de evento para crearWidget: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
Presione F5 para poner el proyecto en modo de ejecución.
Haga clic en el botón Iniciar tarea . Cada vez que
PercentDonese genera el evento, la etiqueta se actualiza con el porcentaje de la tarea que se ha completado.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 producirse hasta que la instrucción permita el procesamiento deMy.Application.DoEventseventos.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 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_Clickprocedimiento, inmediatamente antes de la línea que dicemWidget.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.