Instrução Event
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 | Descrição |
---|---|
attrlist |
Opcional. Lista de atributos que se aplicam a esse 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. Um dos seguintes pode ser feito: - 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 que pode acessá-lo. - Amigo protegido – somente o código na classe do evento, uma classe derivada ou o mesmo assembly pode acessá-lo. - Privado Protegido – somente o código 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 redeclara novamente e oculta um elemento de programação nomeado de forma idêntica, 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 de dentro da classe derivada que o sombreia, exceto de onde o elemento de sombreamento está inacessível. Por exemplo, se um elemento Private sombrear um elemento de classe base, o código que não tem permissão para acessar o elemento Private acessará o elemento de classe base. |
eventname |
Obrigatórios. Nome do evento; segue as convenções de nomenclatura de variáveis padrão. |
parameterlist |
Opcional. Lista de variáveis locais que representam os parâmetros desse 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 de procedimentos Sub que estão sendo implementados. Vários procedimentos são separados por vírgulas:implementedprocedure [ , implementedprocedure ... ] Cada implementedprocedure tem a sintaxe e as partes a seguir:interface .definedname - interface - Required. Nome de uma interface que este procedimento contendo classe ou estrutura está implementando.- Definedname - Required. Nome pelo qual o procedimento é definido em interface . Isso não precisa ser o mesmo que name , o nome que este procedimento está usando para implementar o procedimento definido. |
Custom |
Obrigatórios. Eventos declarados como Custom devem definir acessadores AddHandler , RemoveHandler e RaiseEvent personalizados. |
delegatename |
Opcional. O nome de um delegado que especifica a assinatura do manipulador de eventos. |
AddHandler |
Obrigatórios. Declara um acessador AddHandler , que especifica as instruções a serem executadas quando um manipulador de eventos é adicionado, usando explicitamente a instrução AddHandler ou usando implicitamente a cláusula Handles . |
End AddHandler |
Obrigatórios. Termina o bloco AddHandler . |
value |
Obrigatórios. Nome do parâmetro. |
RemoveHandler |
Obrigatórios. Declara um acessador RemoveHandler , que especifica as instruções a serem executadas quando um manipulador de eventos é removido usando a instrução RemoveHandler . |
End RemoveHandler |
Obrigatórios. Termina o bloco RemoveHandler . |
RaiseEvent |
Obrigatórios. Declara um acessador RaiseEvent , que especifica as instruções a serem executadas quando o evento é gerado usando a instrução RaiseEvent . Normalmente, isso invoca uma lista de delegados mantidos pelos acessadores AddHandler e RemoveHandler . |
End RaiseEvent |
Obrigatórios. Termina o bloco RaiseEvent . |
delegatesignature |
Obrigatórios. Lista de parâmetros que correspondem aos parâmetros exigidos pelo delegado delegatename . Você deve colocar a Lista de Parâmetros entre parênteses. |
statements |
Opcional. Instruções que contêm os corpos dos métodos AddHandler , RemoveHandler e RaiseEvent . |
End Event |
Obrigatórios. Termina o bloco Event . |
Comentários
Depois que o evento for declarado, use a instrução RaiseEvent
para acionar o evento. Um evento típico pode ser declarado e gerado conforme mostrado nos fragmentos a seguir:
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
Observação
É possível declarar argumentos de evento da mesma forma que faz com argumentos de procedimentos, com as seguintes exceções: os eventos não podem ter argumentos nomeados, argumentos ParamArray
ou argumentos Optional
. Os eventos não têm valores retornados.
Para manipular um evento, você deve associá-lo com uma sub-rotina manipuladora de eventos usando a instrução Handles
ou AddHandler
. As assinaturas da sub-rotina e do evento devem corresponder. Para lidar com um evento compartilhado, você deve usar a instrução AddHandler
.
Você só pode usar Event
no nível do módulo. Isso significa que o contexto de 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, que lhe permite definir eventos personalizados. Em um evento personalizado, você especifica exatamente o que ocorre quando o código adiciona ou remove um manipulador de eventos de ou para o 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 o bloqueio.
Exemplo
O exemplo a seguir usa eventos para contagem regressiva de segundos de 10 para 0. O código ilustra vários métodos, propriedades e instruções relacionados a evento. Isso inclui a instrução RaiseEvent
.
A classe que gera um evento é a origem do evento e os métodos que processam o evento são os manipuladores de eventos. Uma origem do evento pode ter vários manipuladores para os eventos gerados. Quando a classe aciona o evento, esse evento é gerado em cada classe que optou por tratar 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 para 0 segundos. Quando o tempo integral (10 segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".
O código para Form1
especifica os estados iniciais e terminais 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 chamado Button1
e uma caixa de texto chamada TextBox1
para o formulário principal, chamado 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ódigo.
Adicione uma variável WithEvents
à seção declarações da classe Form1
:
Private WithEvents mText As TimerState
Adicione o código a seguir ao código de Form1
. Substitua todos os 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 de rótulo Iniciar. A primeira caixa de texto começa a contar os segundos. Quando o tempo integral (10 segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".
Observação
O método My.Application.DoEvents
não processa eventos da mesma forma que o formulário. Para habilitar o formulário para manipular os eventos diretamente, use o multithreading. Para obter mais informações, confira Threading gerenciado.