VB .NET -  Disparando eventos com RaiseEvent


 No artigo de hoje vou mostrar como usar a instrução RaiseEvent na linguagem VB .NET.

A instrução RaiseEvent dispara um evento declarado no nível de módulo dentro uma classe, formulário ou documento.

Sintaxe :     RaiseEvent eventname[( argumentlist )]
eventname
Obrigatório.Nome do evento a disparar.
argumentlist
Opcional. Lista delimitada por vírgulas de variáveis, matrizes ou expressões. O argumento argumentlist deve estar entre parênteses.
 
Se não houver nenhum argumento, os parênteses devem ser omitidos.

O eventname é o nome de um evento declarado dentro do módulo. Ele segue as convenções de nomenclatura de variáveis de Visual Basic.

Se o evento não foi declarado dentro do módulo no qual ele é disparado, vai ocorrer um erro

Não é possível usar RaiseEvent para gerar eventos que não são explicitamente declarados no módulo.

Por exemplo, todos os formulários herdam um evento Click de System.Windows.Forms, mas um Form, não pode ser levantado usando o RaiseEvent em um formulário derivado.

Se você declarar um evento Click no módulo de formulário, ele vai ocultar o próprio evento Click do formulário. Você ainda pode invocar o evento Click do formulário chamando o método OnClick.

Por padrão, um evento definido em Visual Basic dispara seus manipuladores de eventos na ordem em que as conexões são estabelecidas.Como os eventos podem ter parâmetros ByRef, um processo que se conecta mais tarde poderá receber parâmetros que foram alterados por um manipulador de eventos anterior. Depois de executar os manipuladores de eventos, o controlador é retornado para a sub-rotina que disparou o evento.

Vejamos um exemplo prático que ilustra esses conceitos.

O exemplo que irei mostrar usa os eventos para realizar uma contagem regressiva de 10 até zero. O código ilustra vários eventos relacionados a eventos, propriedades e instruções, incluindo a instrução RaiseEvent . Vamos usar uma classe Cronometro para gerar o evento.

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 fonte de eventos pode ter vários manipuladores para eventos que ela gera.

Quando a classe gera o evento, esse evento é gerado em cada classe que decidiu manipular eventos para essa instância do objeto.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a solução no VS 2015

Abra o VS 2015 Community  e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome : VBNET_RaiseEvent;

A seguir no formulário padrão form1.vb inclua os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme a figura abaixo:

A seguir, após a declaração do formulário declare o objeto mTexto com o evento Cronometro.

Private WithEvents mTexto As Cronometro

A instrução WithEvents e a cláusula Handles fornecem uma maneira declarativa de especificar os manipuladores de eventos.

Um evento gerado por um objeto declarado com a palavra-chave WithEvents pode ser tratado por qualquer procedimento com uma instrução Handles para esse evento.

No evento Load do formulario - form1 - inclua o código abaixo:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Button1.Text = "Iniciar !"
        mTexto = New Cronometro
End Sub

O código acima simplesmente atribui o texto Iniciar á propriedade Text do controle Button e cria uma instância da classe Cronometro atribuindo-a à variável mTexto.

O código da classe Cronometro é visto a seguir :

  Class Cronometro
        Public Event AtualizaTempo(ByVal contador As Double)
        Public Event Terminado()
        Public Sub IniciarContagem(ByVal Duracao As Double, ByVal Incremento As Double)
            Dim Inicio As Double = DateAndTime.Timer
            Dim TempoDecorrido As Double = 0
            Dim AteAgora As Double = 0
            Do While TempoDecorrido < Duracao
                If TempoDecorrido > AteAgora + Incremento Then
                    AteAgora += Incremento
                    RaiseEvent AtualizaTempo(Duracao - AteAgora)
                End If
                TempoDecorrido = DateAndTime.Timer - Inicio
            Loop
            RaiseEvent Terminado()
   End Sub

Esta classe declara dois eventos : AtualizaTempo() e Terminado() que serão disparados pela instrução RaiseEvent.

A seguir inclua o código abaixo no evento Click do controle Button1 :

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        mTexto.IniciarContagem(10.0, 0.1)
 End Sub               

Quando o usuário clicar no botão o método IniciarContagem() da classe Cronometro será invocado.

A seguir vamos declarar dois métodos associados com os eventos Terminado e AtualizaTempo definidos na classe Cronometro.

Quando esses eventos forem disparados pela instrução RaiseEvent eles serão tratados pelo código a seguir:

Private Sub mTexto_ChangeText() Handles mTexto.Terminado
        TextBox1.Text = "Concluído !"
End Sub

Private Sub mTexto_AtualizaTempo(ByVal contador As Double) Handles mTexto.AtualizaTempo
        TextBox1.Text = Format(contador, "##0.0")
        ' Use DoEvents para permitir a exibição do refresh.
        My.Application.DoEvents()
End Sub

Executando o projeto e clicando no botão de comando iremos obter:

Inicialmente o cronômetro é iniciado e o evento AtualizaTempo() disparado, atualizando o TextBox com os valores; ao final o evento Terminado() é disparado.

Pegue o projeto completo aqui :  VBNET_RaiseEvent.zip

Porque há um só Deus, e um só Mediador entre Deus e os homens, Jesus Cristo homem.
1 Timóteo 2:5

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti