Partilhar via


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 como Object— 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 utilizar WithEvents ou Handles lidar com eventos a partir de um Structure. Em ambos os casos, pode usar a AddHandler 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, AddHandlero seu recurso RemoveHandlerproporciona 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
    
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.