Eventos (Visual Basic)
Embora possa visualizar um projeto Visual Studio como uma série de procedimentos que executam numa sequência, na realidade, a maioria dos programas são orientados para o evento - o que significa que o fluxo de execução é determinado por ocorrências externas chamadas eventos.
Um evento é um sinal que informa uma aplicação de que algo importante ocorreu. Por exemplo, quando um utilizador clica num controlo de um formulário, o formulário pode levantar um Click
evento e chamar um procedimento que trata do evento. Os eventos também permitem que tarefas separadas se comuniquem. Diga, por exemplo, que a sua aplicação executa uma espécie de tarefa separadamente da aplicação principal. Se um utilizador cancelar o tipo, a sua aplicação pode enviar um evento de cancelamento instruindo o processo de classificação para parar.
Termos e Conceitos do Evento
Esta secção descreve os termos e conceitos utilizados com eventos em Visual Basic.
Declarando Eventos
Declara eventos dentro de classes, estruturas, módulos e interfaces usando a Event
palavra-chave, como no exemplo seguinte:
Event AnEvent(ByVal EventNumber As Integer)
Elevação de Eventos
Um evento é como uma mensagem anunciando que algo importante aconteceu. O ato de transmitir a mensagem chama-se levantar o evento. Em Visual Basic, você levanta eventos com a RaiseEvent
declaração, como no exemplo seguinte:
RaiseEvent AnEvent(EventNumber)
Os eventos devem ser levantados no âmbito da classe, módulo ou estrutura onde são declarados. Por exemplo, uma classe derivada não pode levantar eventos herdados de uma classe base.
Remetentes de eventos
Qualquer objeto capaz de criar um evento é um remetente de eventos, também conhecido como uma fonte de evento. Formulários, controlos e objetos definidos pelo utilizador são exemplos de remetentes de eventos.
Processadores de Eventos
Os manipuladores de eventos são procedimentos que são chamados quando ocorre um evento correspondente. Pode utilizar qualquer subrotina válida com uma assinatura correspondente como manipulador de eventos. No entanto, não é possível utilizar uma função como manipulador de eventos, uma vez que não pode devolver um valor à fonte do evento.
Visual Basic usa uma convenção de nomeação padrão para manipuladores de eventos que combina o nome do remetente do evento, um sublinhado e o nome do evento. Por exemplo, o Click
caso de um botão nomeado button1
seria nomeado Sub button1_Click
.
Nota
Recomendamos que utilize esta convenção de nomeação ao definir os manipuladores de eventos para os seus próprios eventos, mas não é necessário; pode utilizar qualquer nome subrotina válido.
Associando eventos com manipuladores de eventos
Antes que um manipulador de eventos se torne utilizável, você deve primeiro associá-lo a um evento usando o Handles
ou AddHandler
a declaração.
WithEvents e a Cláusula de Alças
A WithEvents
declaração e Handles
a cláusula fornecem uma forma declarativa de especificar os manipuladores de eventos. Um evento levantado por um objeto declarado com a WithEvents
palavra-chave pode ser tratado por qualquer procedimento com uma Handles
declaração para esse evento, como mostra o seguinte exemplo:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
A WithEvents
afirmação e a Handles
cláusula são muitas vezes a melhor escolha para os manipuladores de eventos porque a sintaxe declarativa que eles usam facilita o manuseamento do evento para codificar, ler e depurar. No entanto, esteja ciente das seguintes limitações à utilização de WithEvents
variáveis:
Não se pode usar uma
WithEvents
variável como variável de objeto. Ou seja, não pode declará-lo comoObject
— deve especificar o nome da classe quando declara a variável.Como os eventos partilhados não estão ligados a casos de classe, não pode usar
WithEvents
para lidar declarativamente com eventos partilhados. Da mesma forma, não pode utilizarWithEvents
ouHandles
lidar com eventos a partir de umStructure
. Em ambos os casos, pode usar aAddHandler
declaração para lidar com estes eventos.Não se pode criar matrizes de
WithEvents
variáveis.
WithEvents
as variáveis permitem que um único manipulador de eventos lide com um ou mais tipos de eventos, ou um ou mais manipuladores de eventos para lidar com o mesmo tipo de evento.
Embora a Handles
cláusula seja a forma padrão de associar um evento com um manipulador de eventos, limita-se a associar eventos com manipuladores de eventos no momento da compilação.
Em alguns casos, como em eventos associados a formulários ou controlos, Visual Basic automaticamente desativa um manipulador de eventos vazio e associa-o a um evento. Por exemplo, quando clica duas vezes num botão de comando num formulário no modo de design, Visual Basic cria um manipulador de eventos vazio e uma WithEvents
variável para o botão de comando, como no seguinte código:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler e RemoveHandler
A AddHandler
declaração é semelhante à Handles
cláusula na qual ambos permitem especificar um manipulador de eventos. No entanto, AddHandler
o seu recurso RemoveHandler
proporciona uma maior flexibilidade do que a Handles
cláusula, permitindo-lhe adicionar, remover e alterar dinamicamente o manipulador de eventos associado a um evento. Se quiser lidar com eventos ou eventos partilhados a partir de uma estrutura, deve utilizar AddHandler
.
AddHandler
leva dois argumentos: o nome de um evento de um remetente de eventos como um controlo, e uma expressão que avalia a um delegado. Não é necessário especificar explicitamente a classe de delegado ao utilizar AddHandler
, uma vez que a AddressOf
declaração devolve sempre uma referência ao delegado. O exemplo a seguir associa um manipulador de eventos a um evento criado por um objeto:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, que desliga um evento de um manipulador de eventos, usa a mesma sintaxe que AddHandler
. . Por exemplo:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
No exemplo seguinte, um manipulador de eventos está associado a um evento, e o evento é levantado. O manipulador do evento apanha o evento e exibe uma mensagem.
Em seguida, o manipulador do primeiro evento é removido e um manipulador de eventos diferente é associado com o evento. Quando o evento é levantado novamente, uma mensagem diferente é exibida.
Finalmente, o segundo manipulador de eventos é removido e o evento é levantado pela terceira vez. Como já não existe um manipulador de eventos associado ao evento, não são tomadas medidas.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
Eventos de manuseamento Herdados de uma Classe Base
Classes derivadas — classes que herdam características de uma classe base — podem lidar com eventos criados pela sua classe base usando a Handles MyBase
declaração.
Para lidar com eventos de uma classe base
Declare um manipulador de eventos na classe derivada adicionando uma
Handles MyBase.
declaração de nome eventna à linha de declaração do seu procedimento de manipulador de eventos, onde o nome de evento é o nome do evento na classe base que está a manusear. Por exemplo:Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
Secções Relacionadas
Título | Descrição |
---|---|
Walkthrough: Declarando e aumentando eventos | Fornece uma descrição passo a passo de como declarar e elevar eventos para uma classe. |
Walkthrough: Handling Events | Demonstra como escrever um procedimento de manipulador de eventos. |
Como: Declarar eventos personalizados para evitar bloqueios | Demonstra como definir um evento personalizado que permite aos seus manipuladores de eventos serem chamados assíncronos. |
Como: Declarar Eventos Personalizados Para Conservar a Memória | Demonstra como definir um evento personalizado que usa a memória apenas quando o evento é tratado. |
Resolução de problemas Manipuladores de Eventos Herdados em Visual Basic | Lista questões comuns que surgem com manipuladores de eventos em componentes herdados. |
Eventos | Fornece uma visão geral do modelo de evento no .NET Framework. |
Criar manipuladores de eventos em Windows Forms | Descreve como trabalhar com eventos associados a objetos Windows Forms. |
Delegados | Fornece uma visão geral dos delegados em Visual Basic. |