Declaração do Evento

Declara um evento definido pelo usuário.

Sintaxe

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

Partes

Parte Description
attrlist Opcional. Lista de atributos que se aplicam a este evento. Vários atributos são separados por vírgulas. Você deve colocar a Lista de Atributos entre colchetes angulares ("<" e ">").
accessmodifier Opcional. Especifica qual código pode acessar o evento. Pode ser um dos seguintes:

- Público — qualquer código que possa acessar o elemento que o declara pode acessá-lo.
- Protegido — somente o código dentro de sua classe ou uma classe derivada pode acessá-lo.
- Amigo — somente o código no mesmo assembly pode acessá-lo.
- Privado — somente o código no elemento que o declara pode acessá-lo.
- O código Protected Friend-only na classe do evento, uma classe derivada ou o mesmo assembly pode acessá-lo.
- O código protegido privado somente na classe do evento ou uma classe derivada no mesmo assembly pode acessá-lo.
Shared Opcional. Especifica que esse evento não está associado a uma instância específica de uma classe ou estrutura.
Shadows Opcional. Indica que esse evento redeclares e oculta um elemento de programação com nome idêntico, ou conjunto de elementos sobrecarregados, em uma classe base. Você pode sombrear qualquer tipo de elemento declarado com qualquer outro tipo.

Um elemento sombreado não está disponível na classe derivada que o sombreia, exceto de onde o elemento de sombreamento é inacessível. Por exemplo, se um Private elemento sombreia um elemento de classe base, o código que não tem permissão para acessar o Private elemento acessa o elemento de classe base.
eventname Obrigatório. Nome do evento; segue convenções de nomenclatura de variáveis padrão.
parameterlist Opcional. Lista de variáveis locais que representam os parâmetros deste evento. Você deve colocar a Lista de parâmetros entre parênteses.
Implements Opcional. Indica que esse evento implementa um evento de uma interface.
implementslist Necessário se Implements for fornecido. Lista dos Sub procedimentos em curso. Vários procedimentos são separados por vírgulas:

procedimento aplicado [ , procedimento aplicado... ]

Cada implementedprocedure um tem a seguinte sintaxe e partes:

interface.definedname

- interface -Necessário. Nome de uma interface que este procedimento contém classe ou estrutura está implementando.
- Definedname -Necessário. Nome pelo qual o procedimento é definido em interface. Isso não precisa ser o mesmo nameque , o nome que este procedimento está usando para implementar o procedimento definido.
Custom Obrigatório. Os eventos declarados como Custom devem definir personalizados AddHandler, RemoveHandlere RaiseEvent acessadores.
delegatename Opcional. O nome de um delegado que especifica a assinatura do manipulador de eventos.
AddHandler Obrigatório. Declara um AddHandler acessador, que especifica as instruções a serem executadas quando um manipulador de eventos é adicionado, explicitamente usando a AddHandler instrução ou implicitamente usando a Handles cláusula.
End AddHandler Obrigatório. Encerra o AddHandler bloco.
value Obrigatório. Nome do parâmetro.
RemoveHandler Obrigatório. Declara um RemoveHandler acessador, que especifica as instruções a serem executadas quando um manipulador de eventos é removido usando a RemoveHandler instrução.
End RemoveHandler Obrigatório. Encerra o RemoveHandler bloco.
RaiseEvent Obrigatório. Declara um RaiseEvent acessador, que especifica as instruções a serem executadas quando o evento é gerado usando a RaiseEvent instrução. Normalmente, isso invoca uma lista de delegados mantida pelos AddHandler e RemoveHandler acessadores.
End RaiseEvent Obrigatório. Encerra o RaiseEvent bloco.
delegatesignature Obrigatório. Lista de parâmetros que correspondem aos parâmetros exigidos delegatename pelo delegado. Você deve colocar a Lista de parâmetros entre parênteses.
statements Opcional. Declarações que contêm os corpos do AddHandler, RemoveHandlere RaiseEvent métodos.
End Event Obrigatório. Encerra o Event bloco.

Observações

Uma vez declarado o evento, use a RaiseEvent instrução para gerar o evento. Um evento típico pode ser declarado e gerado como mostrado nos seguintes fragmentos:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Nota

Você pode declarar argumentos de evento da mesma forma que declara argumentos de procedimentos, com as seguintes exceções: os eventos não podem ter argumentos, ParamArray argumentos ou Optional argumentos nomeados. Os eventos não têm valores de retorno.

Para manipular um evento, você deve associá-lo a uma sub-rotina do manipulador de eventos usando a Handles instrução or AddHandler . As assinaturas da sub-rotina e do evento devem coincidir. Para manipular um evento compartilhado, você deve usar a AddHandler instrução.

Você pode usar Event apenas no nível do módulo. Isso significa que o contexto da declaração para um evento deve ser uma classe, estrutura, módulo ou interface, e não pode ser um arquivo de origem, namespace, procedimento ou bloco. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Na maioria das circunstâncias, você pode usar a primeira sintaxe na seção Sintaxe deste tópico para declarar eventos. No entanto, alguns cenários exigem que você tenha mais controle sobre o comportamento detalhado do evento. A última sintaxe na seção Sintaxe deste tópico, que usa a palavra-chave Custom , fornece esse controle permitindo que você defina eventos personalizados. Em um evento personalizado, você especifica exatamente o que ocorre quando o código adiciona ou remove um manipulador de eventos para ou do evento, ou quando o código gera o evento. Para obter exemplos, consulte Como declarar eventos personalizados para conservar memória e Como declarar eventos personalizados para evitar bloqueio.

Exemplo

O exemplo a seguir usa eventos para contagem regressiva de segundos de 10 para 0. O código ilustra vários dos métodos, propriedades e instruções relacionados a eventos. Isto inclui a RaiseEvent declaração.

A classe que gera um evento é a fonte do evento, e os métodos que processam o evento são os manipuladores de eventos. Uma fonte de eventos pode ter vários manipuladores para os eventos que gera. Quando a classe gera o evento, esse evento é gerado em cada classe que optou por manipular eventos para essa instância do objeto.

O exemplo também usa um formulário (Form1) com um botão (Button1) e uma caixa de texto (TextBox1). Quando você clica no botão, a primeira caixa de texto exibe uma contagem regressiva de 10 a 0 segundos. Quando o tempo completo (10 segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".

O código para Form1 especifica os estados inicial e terminal do formulário. Ele também contém o código executado quando os eventos são gerados.

Para usar este exemplo, abra um novo projeto do Windows Forms. Em seguida, adicione um botão com o nome Button1 e uma caixa de texto com o nome TextBox1 do formulário principal, denominado Form1. Em seguida, clique com o botão direito do mouse no formulário e clique em Exibir código para abrir o editor de códigos.

Adicione uma WithEvents variável à seção de declarações da Form1 classe:

Private WithEvents mText As TimerState

Adicione o seguinte código ao código de Form1. Substitua quaisquer procedimentos duplicados que possam existir, como Form_Load ou 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

Pressione F5 para executar o exemplo anterior e clique no botão Iniciar. A primeira caixa de texto começa a contar os segundos. Quando o tempo completo (10 segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".

Nota

O My.Application.DoEvents método não processa eventos da mesma forma que o formulário. Para habilitar o formulário para manipular os eventos diretamente, você pode usar multithreading. Para obter mais informações, consulte Threading gerenciado.

Consulte também