Instruções passo a passo: tratando eventos (Visual Basic)

Este é o segundo de dois tópicos que demonstram como trabalhar com eventos. O primeiro tópico, Passo a passo: Declarando e levantando eventos, mostra como declarar e gerar eventos. Esta seção usa o formulário e a classe desse passo a passo para mostrar como lidar com eventos quando eles ocorrem.

O Widget exemplo de classe usa instruções tradicionais de manipulação de eventos. O Visual Basic fornece outras técnicas para trabalhar com eventos. Como um exercício, você pode modificar este exemplo para usar as instruções e AddHandler instruçõesHandles.

Para manipular o evento PercentDone da classe Widget

  1. Posicione o seguinte código em Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    A WithEvents palavra-chave especifica que a variável mWidget é usada para manipular os eventos de um objeto. Especifique o tipo de objeto fornecendo o nome da classe da qual o objeto será criado.

    A variável mWidget é declarada porque Form1 as variáveis devem ser de WithEvents nível de classe. Isso é verdade, independentemente do tipo de classe em que você os coloca.

    A variável mblnCancel é usada para cancelar o LongTask método.

Escrevendo código para manipular um evento

Assim que você declara uma variável usando WithEvents, o nome da variável aparece na lista suspensa à esquerda do Editor de Código da classe. Quando você seleciona mWidget, os Widget eventos da classe aparecem na lista suspensa à direita. Selecionar um evento exibe o procedimento de evento correspondente, com o prefixo mWidget e um sublinhado. Todos os procedimentos de evento associados a uma WithEvents variável recebem o nome da variável como um prefixo.

Para identificar um evento

  1. Selecione mWidget na lista suspensa à esquerda no Editor de Código.

  2. Selecione o evento PercentDone da lista suspensa à direita. O Editor de Códigos abre o procedimento do evento mWidget_PercentDone.

    Observação

    O Editor de Código é útil, mas não necessário, para inserir novos manipuladores de eventos. Neste passo a passo, é mais direto apenas copiar os manipuladores de eventos diretamente em seu código.

  3. Adicione o seguinte código ao manipulador de eventos do mWidget_PercentDone:

    Private Sub mWidget_PercentDone(
        ByVal Percent As Single,
        ByRef Cancel As Boolean
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    Sempre que o PercentDone evento é acionado, o procedimento de evento exibe a porcentagem concluída em um Label controle. O DoEvents método permite que o rótulo seja repinto e também dá ao usuário a oportunidade de clicar no botão Cancelar.

  4. Adicione o seguinte código ao manipulador de eventos Button2_Click:

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Se o usuário clicar no botão Cancelar enquanto LongTask estiver em execução, o Button2_Click evento será executado assim que a instrução permitir que o DoEvents processamento de eventos ocorra. A variável mblnCancel de nível de classe é definida como True, e o mWidget_PercentDone evento o testa e define o ByRef Cancel argumento como True.

Conectando uma variável WithEvents a um objeto

Form1 agora está configurado para manipular os eventos de um Widget objeto. Tudo o que resta é encontrar um Widget lugar.

Quando você declara uma variável WithEvents em tempo de design, nenhum objeto é associado a ela. Uma WithEvents variável é igual a qualquer outra variável de objeto. Você precisa criar um objeto e atribuir uma referência a ele com a WithEvents variável.

Para criar um objeto e atribuir uma referência a ele

  1. Selecione (Eventos form1) na lista suspensa à esquerda no Editor de Código.

  2. Selecione o evento Load da lista suspensa à direita. O Editor de Códigos abre o procedimento do evento Form1_Load.

  3. Adicione o seguinte código para o procedimento de Form1_Load evento para criar:Widget

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

Quando esse código é executado, o Visual Basic cria um objeto Widget e conecta seus eventos aos procedimentos de evento associados a mWidget. A partir desse ponto, sempre que o evento Widget for gerado PercentDone, o procedimento de evento mWidget_PercentDone será executado.

Para chamar o método LongTask

  • Adicione o seguinte código ao manipulador de eventos do Button1_Click:

    Private Sub Button1_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

Antes que o LongTask método seja chamado, o rótulo que exibe a porcentagem concluída deve ser inicializado e o sinalizador de nível Boolean de classe para cancelar o método deve ser definido como False.

LongTask é chamado com uma duração de tarefa de 12,2 segundos. O PercentDone evento é gerado uma vez a cada um terço de segundo. Cada vez que o evento é acionado, o procedimento de mWidget_PercentDone evento é executado.

Quando LongTask terminar, mblnCancel será testado para ver se LongTask terminou normalmente ou se parou porque foi definido como mblnCancelTrue. O percentual concluído é atualizado apenas no caso anterior.

Para executar o programa

  1. Pressione F5 para colocar o projeto no modo de execução.

  2. Clique no botão Iniciar Tarefa. Cada vez que o PercentDone evento é acionado, o rótulo é atualizado com o percentual da tarefa concluída.

  3. Clique no botão Cancelar para parar a tarefa. Observe que a aparência do botão Cancelar não é alterada imediatamente quando você clica nele. O Click evento não pode acontecer até que a instrução permita o My.Application.DoEvents processamento de eventos.

    Observação

    O método My.Application.DoEvents não processa eventos exatamente da mesma forma que o formulário o faz. Por exemplo, neste passo a passo, você deve clicar duas vezes no botão Cancelar. Para habilitar o formulário para manipular os eventos diretamente, você pode usar o multithreading. Para obter mais informações, confira Threading gerenciado.

Você pode achar instrutivo executar o programa com F11 e percorrer o código de uma linha de cada vez. Você pode ver claramente como a execução entra LongTaske, em seguida, reentra Form1 brevemente cada vez que o PercentDone evento é acionado.

O que aconteceria se, enquanto a execução estivesse de volta no código de Form1, o LongTask método fosse chamado novamente? Na pior das hipóteses, um estouro de pilha poderia ocorrer se LongTask fosse chamado toda vez que o evento fosse acionado.

Você pode fazer com que a variável mWidget manipule eventos para um objeto diferente Widget atribuindo uma referência ao novo Widget para mWidget. Na verdade, você pode fazer o código fazer Button1_Click isso toda vez que clicar no botão.

Para manipular eventos para um widget diferente

  • Adicione a seguinte linha de código ao Button1_Click procedimento, imediatamente anterior à linha que diz mWidget.LongTask(12.2, 0.33):

    mWidget = New Widget
    ' Create a new Widget object.
    

O código acima cria um novo Widget cada vez que o botão é clicado. Assim que o LongTask método for concluído, a referência ao Widget método será liberada e ela Widget será destruída.

Uma variável WithEvents pode conter apenas uma referência de objeto por vez, portanto, se você atribuir um objeto diferente Widget, os eventos mWidget do objeto anterior Widget não serão mais tratados. Se mWidget for a única variável de objeto que contém uma referência ao antigo Widget, o objeto será destruído. Se você quiser manipular eventos de vários Widget objetos, use a AddHandler instrução para processar eventos de cada objeto separadamente.

Observação

Você pode declarar quantas WithEvents variáveis precisar, mas não há suporte para matrizes de WithEvents variáveis.

Confira também