Compartilhar via


Passo a passo: manipulando 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 AddHandler e Handles.

Para lidar com o evento PercentDone da classe Widget

  1. Coloque 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 lidar com 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 em Form1 porque as variáveis WithEvents devem ser de 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 mWidget_PercentDone manipulador de eventos:

    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 para o Button2_Click manipulador de eventos:

    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 evento Button2_Click será executado assim que a instrução DoEvents permitir que o processamento de eventos ocorra. A variável mblnCancel de nível de classe é definida como True, e o mWidget_PercentDone evento, em seguida, testa-a e define o ByRef Cancel argumento como True.

Conectando uma variável WithEvents a um objeto

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

Quando você declara uma variável WithEvents em tempo de design, nenhum objeto é associado a ela. Uma WithEvents variável é exatamente como 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 Form1_Load procedimento de evento para criar o Widget:

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

Ao ser 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 invocar o método LongTask

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

    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 ele parou porque mblnCancel foi definido como True. A porcentagem concluída é atualizada somente 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 é gerado, o rótulo é atualizado com o percentual da tarefa concluída.

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

    Observação

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

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 do Form1, o método LongTask 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 em Button1_Click executar isso sempre que clicar no botão.

Para manipular eventos para um widget diferente

  • Adicione a seguinte linha de código ao Button1_Click procedimento, imediatamente antes da 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 sempre que o botão é clicado. Assim que o LongTask método for concluído, a referência ao Widget método será liberada e a Widget será destruída.

Uma WithEvents variável pode conter apenas uma referência de objeto de cada vez, portanto, se você atribuir um objeto diferente Widget , mWidgetos eventos 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 forem necessárias, mas não há suporte para matrizes de WithEvents variáveis.

Consulte também