Partilhar via


Eventos (Visual Basic)

Embora você possa visualizar um projeto do Visual Studio como uma série de procedimentos que são executados em uma sequência, na realidade, a maioria dos programas é orientada por eventos, o que significa que o fluxo de execução é determinado por ocorrências externas chamadas eventos.

Um evento é um sinal que informa um aplicativo de que algo importante ocorreu. Por exemplo, quando um usuário clica em um controle em um formulário, o formulário pode gerar um Click evento e chamar um procedimento que manipula o evento. Os eventos também permitem a comunicação de tarefas separadas. Digamos, por exemplo, que seu aplicativo execute uma tarefa de classificação separadamente do aplicativo principal. Se um utilizador cancelar a ordenação, a sua aplicação poderá enviar um evento de cancelamento instruindo o processo de ordenação a parar.

Termos e Conceitos do Evento

Esta seção descreve os termos e conceitos usados com eventos no Visual Basic.

Declarando eventos

Você declara eventos dentro de classes, estruturas, módulos e interfaces usando a palavra-chave Event , como no exemplo a seguir:

Event AnEvent(ByVal EventNumber As Integer)

Geração de Eventos

Um evento é como uma mensagem anunciando que algo importante ocorreu. O ato de transmitir a mensagem é chamado de levantar o evento. No Visual Basic, você gera eventos com a RaiseEvent instrução, como no exemplo a seguir:

RaiseEvent AnEvent(EventNumber)

Os eventos devem ser gerados dentro do escopo da classe, módulo ou estrutura onde são declarados. Por exemplo, uma classe derivada não pode gerar eventos herdados de uma classe base.

Emissores de eventos

Qualquer objeto capaz de gerar um evento é um remetente de eventos, também conhecido como fonte de eventos. Formulários, controles e objetos definidos pelo usuário são exemplos de remetentes de eventos.

Gestores de Eventos

Manipuladores de eventos são procedimentos que são chamados quando ocorre um evento correspondente. Você pode usar qualquer sub-rotina válida com uma assinatura correspondente como um manipulador de eventos. No entanto, você não pode usar uma função como um manipulador de eventos, porque ele não pode retornar um valor para a fonte de eventos.

Visual Basic usa uma convenção de nomenclatura 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 evento de um botão chamado button1 seria chamado Sub button1_Click.

Observação

Recomendamos que você use essa convenção de nomenclatura ao definir manipuladores de eventos para seus próprios eventos, mas ela não é necessária; Você pode usar qualquer nome de sub-rotina válido.

Associando eventos a manipuladores de eventos

Antes de um manipulador de eventos se tornar utilizável, deve primeiro associá-lo a um evento, usando a instrução Handles ou AddHandler.

WithEvents e a cláusula Handles

A instrução WithEvents e a cláusula Handles fornecem uma maneira declarativa de especificar manipuladores de eventos. Um evento gerado por um objeto declarado com a palavra-chave WithEvents pode ser manipulado por qualquer procedimento que tenha uma instrução Handles para esse evento, conforme mostrado no exemplo a seguir:

' 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 instrução e a Handles cláusula geralmente são a melhor escolha para manipuladores de eventos porque a sintaxe declarativa que eles usam torna o tratamento de eventos mais fácil de codificar, ler e depurar. No entanto, esteja ciente das seguintes limitações no uso de WithEvents variáveis:

  • Não é possível usar uma WithEvents variável como uma variável de objeto. Ou seja, você não pode declará-lo como Object—você deve especificar o nome da classe quando declarar a variável.

  • Como os eventos compartilhados não estão vinculados a instâncias de classe, você não pode usar WithEvents para manipular declarativamente eventos compartilhados. Da mesma forma, não se pode usar WithEvents ou Handles para manipular eventos de um Structure. Em ambos os casos, pode-se usar a instrução AddHandler para gerir esses eventos.

  • Não é possível criar matrizes de WithEvents variáveis.

WithEvents As variáveis permitem que um único manipulador de eventos manipule um ou mais tipos de evento, ou um ou mais manipuladores de eventos manipulem o mesmo tipo de evento.

Embora a Handles cláusula seja a maneira padrão de associar um evento a um manipulador de eventos, ela é limitada a associar eventos a manipuladores de eventos em tempo de compilação.

Em alguns casos, como com eventos associados a formulários ou controles, o Visual Basic automaticamente elimina um manipulador de eventos vazio e o associa a um evento. Por exemplo, quando você clica duas vezes em um botão de comando em um formulário no modo de design, o Visual Basic cria um manipulador de eventos vazio e uma WithEvents variável para o botão de comando, como no código a seguir:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler e RemoveHandler

A AddHandler instrução é semelhante à Handles cláusula em que ambos permitem especificar um manipulador de eventos. No entanto, AddHandler, usado com RemoveHandler, fornece maior flexibilidade do que a Handles cláusula, permitindo que você adicione, remova e altere dinamicamente o manipulador de eventos associado a um evento. Se você quiser manipular eventos compartilhados ou eventos de uma estrutura, você deve usar AddHandler.

AddHandler Usa dois argumentos: o nome de um evento de um remetente de evento, como um controle, e uma expressão que é avaliada para um delegado. Não é necessário especificar explicitamente a classe delegate ao usar AddHandler, pois a AddressOf instrução sempre retorna uma referência ao delegado. O exemplo a seguir associa um manipulador de eventos a um evento gerado por um objeto:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, que desconecta um evento de um manipulador de eventos, usa a mesma sintaxe que AddHandler. Por exemplo:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

No exemplo a seguir, um manipulador de eventos é associado a um evento e o evento é gerado. O manipulador de eventos captura o evento e exibe uma mensagem.

Em seguida, o primeiro manipulador de eventos é removido e um manipulador de eventos diferente é associado ao evento. Quando o evento é gerado novamente, uma mensagem diferente é exibida.

Finalmente, o segundo manipulador de eventos é removido e o evento é gerado pela terceira vez. Como não há mais um manipulador de eventos associado ao evento, nenhuma ação é executada.

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

Manipulando eventos herdados de uma classe base

As classes derivadas — classes que herdam características de uma classe base — podem manipular eventos gerados por sua classe base usando a Handles MyBase instrução.

Para manipular eventos de uma classe base

  • Declare um manipulador de eventos na classe derivada adicionando uma Handles MyBase. instrução eventname à linha de declaração do procedimento do manipulador de eventos, onde eventname é o nome do evento na classe base que você está manipulando. 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
    
Título Descrição
Passo a passo: Declarando e levantando eventos Fornece uma descrição passo a passo de como declarar e gerar eventos para uma classe.
Passo a passo: Manipulando eventos Demonstra como escrever um procedimento de manipulador de eventos.
Como: Declarar eventos personalizados para evitar o bloqueio Demonstra como definir um evento personalizado que permite que seus manipuladores de eventos sejam chamados de forma assíncrona.
Como: Declarar eventos personalizados para conservar memória Demonstra como definir um evento personalizado que usa memória somente quando o evento é manipulado.
Solucionando problemas de manipuladores de eventos herdados no Visual Basic Lista problemas comuns que surgem com manipuladores de eventos em componentes herdados.
Eventos Fornece uma visão geral do modelo de evento no .NET Framework.
Criando manipuladores de eventos no Windows Forms Descreve como trabalhar com eventos associados a objetos do Windows Forms.
Delegados Fornece uma visão geral dos delegados no Visual Basic.