Compartir vía


RaiseEvent (Instrucción)

Desencadena un evento declarado en el nivel de módulo dentro de una clase, formulario o documento.

Sintaxis

RaiseEvent eventname[( argumentlist )]  

Partes

eventname
Necesario. Nombre del evento que se va a desencadenar.

argumentlist
Opcional. Lista delimitada por comas de variables, matrices o expresiones. El argumento argumentlist debe ir entre paréntesis. Si no hay ningún argumento, se deben omitir los paréntesis.

Comentarios

El valor obligatorio eventname es el nombre de un evento declarado en el módulo. Sigue las convenciones de nomenclatura de variables de Visual Basic.

Si el evento no se ha declarado en el módulo en el que se genera, se produce un error. El siguiente fragmento de código muestra una declaración de evento y un procedimiento en el que se genera el evento.

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

No se puede usar RaiseEvent para generar eventos que no se declaran explícitamente en el módulo. Por ejemplo, todos los formularios heredan un evento Click de System.Windows.Forms.Form, no se puede generar mediante RaiseEvent en un formulario derivado. Si declara un evento Click en el módulo de formulario, este sombrea el propio evento Click del formulario. Todavía podrá invocar al evento Click del formulario llamando al método OnClick.

De forma predeterminada, un evento definido en Visual Basic genera sus controladores de eventos en el orden en que se establecen las conexiones. Dado que los eventos pueden tener parámetros ByRef, un proceso que se conecta tarde puede recibir parámetros modificados por un controlador de eventos anterior. Una vez ejecutados los controladores de eventos, el control se devuelve a la subrutina que generó el evento.

Nota

Los eventos no compartidos no deben generarse dentro del constructor de la clase en la que se declaran. Aunque estos eventos no provocan errores en tiempo de ejecución, es posible que no se detecten mediante los controladores de eventos asociados. Use el modificador Shared para crear un evento compartido si necesita generar un evento desde un constructor.

Nota

Para cambiar el comportamiento predeterminado de los eventos, puede definir un evento personalizado. En el caso de los eventos personalizados, la instrucción RaiseEvent invoca el descriptor de acceso del evento RaiseEvent. Para obtener más información acerca de los eventos personalizados, consulte Event (Instrucción).

Ejemplo 1

En el ejemplo siguiente se usan eventos para contar los segundos de 10 a 0. El código muestra algunos de los métodos, propiedades e instrucciones relacionados con eventos, incluida la instrucción RaiseEvent.

La clase que provoca un evento es el origen del evento, y los métodos que procesan el evento son los controladores de eventos. Un origen de eventos puede tener varios controladores para los eventos que genera. Cuando la clase genera el evento, ese evento se genera en cada clase que eligió controlar eventos para esa instancia del objeto.

El ejemplo también usa un formulario (Form1) con un botón (Button1) y un cuadro de texto (TextBox1). Al hacer clic en el botón, el primer cuadro de texto muestra una cuenta atrás de 10 a 0 segundos. Cuando transcurre el tiempo (10 segundos), el primer cuadro de texto muestra "Done".

El código de Form1 especifica los estados inicial y terminal del formulario. También contiene el código que se ejecuta cuando se producen eventos.

Para usar este ejemplo, abra un nuevo proyecto de aplicación Windows, agregue un botón denominado Button1 y un cuadro de texto denominado TextBox1 al formulario principal, denominado Form1. Posteriormente, haga clic con el botón derecho en el formulario y haga clic en Ver código para abrir el editor de código.

Agregue una variable WithEvents a la sección de declaraciones de la clase Form1.

Private WithEvents mText As TimerState

Ejemplo 2

Agregue el código siguiente al código de Form1. Sustituya los procedimientos duplicados que existan, como Form_Load o Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Presione F5 para ejecutar el ejemplo anterior y haga clic en el botón Iniciar. El primer cuadro de texto empieza la cuenta atrás de los segundos. Cuando transcurre el tiempo (10 segundos), el primer cuadro de texto muestra "Done".

Nota

El método My.Application.DoEvents no procesa los eventos exactamente de la misma manera que el formulario. Para permitir que el formulario controle directamente los eventos, puede usar multithreading. Para obtener más información, consulte Subprocesamiento administrado.

Vea también