Tutorial: Declarar y provocar eventos (Visual Basic)
En este tutorial se muestra cómo declarar y generar eventos para una clase denominada Widget . Después de completar los pasos, es posible que quiera leer el tema complementario Tutorial:Controlar eventos , que muestra cómo usar eventos de objetos para proporcionar información de estado en Widget una aplicación.
La clase Widget
Supongamos por el momento que tiene una Widget clase. La clase tiene un método que puede tardar mucho tiempo en ejecutarse y desea que la aplicación pueda colocar algún tipo Widget de indicador de finalización.
Por supuesto, podría hacer que el objeto mostrara un cuadro de diálogo de porcentaje completo, pero luego se quedaría atascado con ese cuadro de diálogo en todos los proyectos en los que Widget usó la Widget clase . Un buen principio de diseño de objetos es permitir que la aplicación que usa un objeto controle la interfaz de usuario, a menos que todo el propósito del objeto sea administrar un formulario o un cuadro de diálogo.
El propósito de es realizar otras tareas, por lo que es mejor agregar un evento y permitir que el procedimiento que llama a los métodos de controle ese evento y muestre las actualizaciones Widget PercentDone de Widget estado. El PercentDone evento también puede proporcionar un mecanismo para cancelar la tarea.
Para compilar el ejemplo de código para este tema
Abra un nuevo proyecto Visual Basic Windows application y cree un formulario denominado
Form1.Agregue dos botones y una etiqueta a
Form1.Asigne nombre a los objetos tal y como se muestra en la tabla siguiente.
Object Propiedad Parámetro Button1TextTarea de inicio Button2TextCancelar Label(Name),TextlblPercentDone, 0 En el Project, elija Agregar clase para agregar una clase
Widget.vbdenominada al proyecto.
Para declarar un evento para la clase Widget
Use la
Eventpalabra clave para declarar un evento en la claseWidget. Tenga en cuenta que un evento puede tenerByValByRefargumentos y , comoWidgetmuestra el evento dePercentDone:Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
Cuando el objeto que realiza la llamada recibe PercentDone un evento, Percent el argumento contiene el porcentaje de la tarea que se ha completado. El Cancel argumento se puede establecer en para cancelar el método que ha producido el True evento.
Nota
Puede declarar argumentos de evento igual que los argumentos de procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos o y los eventos no tienen Optional ParamArray valores devueltos.
El método de la PercentDone clase genera el evento LongTask Widget . LongTask toma dos argumentos: el tiempo durante el que el método pretende realizar el trabajo y el intervalo de tiempo mínimo antes de LongTask pausar para generar el PercentDone evento.
Para generar el evento PercentDone
Para simplificar el acceso a la propiedad utilizada por esta clase, agregue una instrucción al principio de la sección declaraciones del módulo de
TimerImportsclase, encima de laClass Widgetinstrucción .Imports Microsoft.VisualBasic.DateAndTimeAgregue el código siguiente a la clase
Widget:Public Sub LongTask(ByVal Duration As Single, ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
Cuando la aplicación llama al LongTask método , la clase genera el evento cada Widget PercentDone MinimumInterval segundos. Cuando el evento vuelve, LongTask comprueba si el argumento se Cancel estableció en True .
Aquí se necesita unas cuantas declinaciones de responsabilidades. Por motivos de simplicidad, LongTask el procedimiento supone que conoce de antemano cuánto tiempo llevará la tarea. Este es casi nunca el caso. Dividir tareas en fragmentos de tamaño par puede ser difícil y, a menudo, lo que más importa a los usuarios es simplemente la cantidad de tiempo que transcurre antes de que obtengan una indicación de que algo está ocurriendo.
Es posible que haya detectado otro error en este ejemplo. La propiedad devuelve el número de segundos transcurridos desde la medianoche; por lo tanto, la aplicación se queda bloqueada si se inicia justo antes Timer de medianoche. Un enfoque más cuidadoso para medir el tiempo tendría en cuenta condiciones límite como esta o las evitaría por completo mediante propiedades como Now .
Ahora que la Widget clase puede generar eventos, puede pasar al siguiente tutorial. Tutorial: Control de eventos muestra cómo usar WithEvents para asociar un controlador de eventos al PercentDone evento.