Compartilhar via


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

Este é o segundo dos dois tópicos que demonstram como trabalhar com eventos. O primeiro tópico, passo a passo: declarativo e geração de eventos, mostra como declarar e disparar eventos. Esta seção usa o formulário e classe essa explicação passo a passo para mostrar como manipular eventos quando eles ocorrem.

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

Para manipular o evento PercentDone da classe Widget

  • Coloque o seguinte código em Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

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

    A variável mWidget for declarado em Form1 porque WithEvents variáveis devem ser de nível de classe. Isso é verdadeiro independentemente do tipo da classe que você colocá-los em.

    A variável mblnCancel é usado para cancelar a LongTask método.

Escrevendo código para manipular um evento

Assim que você declarar uma variável usando WithEvents, o nome da variável é exibido na lista suspensa à esquerda da classe O Editor de código. Quando você seleciona mWidget, o Widget eventos da classe aparecem na lista suspensa à direita. A seleção de um evento exibe o procedimento de evento correspondente, com o prefixo mWidget e um sublinhado. Os procedimentos de evento associados com um WithEvents variável recebem o nome da variável como um prefixo.

Para manipular um evento

  1. Selecione mWidget na lista drop-down esquerda no O Editor de código.

  2. Selecione o PercentDone o evento na lista suspensa à direita. O O Editor de código abre o mWidget_PercentDone procedimento de evento.

    Dica

    O O Editor de código é útil, mas não é necessária, para inserir novos manipuladores de eventos.Esta explicação passo a passo, é mais direto para apenas copiar os manipuladores de eventos diretamente no seu código.

  3. Adicione o seguinte código para o manipulador de eventos 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 é gerado, o procedimento de evento exibe a porcentagem concluída em um Label controle. O DoEvents método permite que o rótulo redesenhar e também fornece ao usuário a oportunidade de clique do Cancelar botão.

  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 clica o Cancelar botão enquanto LongTask está em execução, o Button2_Click evento é executado assim que o DoEvents instrução permite o processamento do evento ocorra. A variável de nível de classe mblnCancel for definido como Truee o mWidget_PercentDone evento, em seguida, testa e define o ByRef Cancel argumento para True.

Conectando-se a uma variável WithEvents para um objeto

Form1agora está configurado para lidar com um Widget eventos do 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 ele. A WithEvents variável é assim como qualquer outra variável de objeto. Você deve criar um objeto e atribuir uma referência a ele com o WithEvents variável.

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

  1. Selecione (Form1 Events) na lista drop-down esquerda no O Editor de código.

  2. Selecione o Load o evento na lista suspensa à direita. O O Editor de código abre o Form1_Load procedimento de evento.

  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
    

Quando esse código é executado, Visual Basic cria um Widget de objeto e conecta seus eventos para os procedimentos de evento associados com mWidget. Partir desse ponto, sempre que o Widget eleva seu PercentDone evento, o mWidget_PercentDone o procedimento de evento é executado.

Para chamar o método LongTask

  • Adicione o seguinte código para o manipulador de eventos 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 do LongTask método é chamado, o rótulo que exibe a porcentagem concluída deve ser inicializado e o nível de classe Boolean sinalizar para cancelar o método deve ser definida como False.

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

Quando LongTask for feito, mblnCancel é testado para ver se LongTask foi encerrado normalmente, ou se ele parar porque mblnCancel foi definido como True. A porcentagem concluída é atualizada apenas no caso anterior.

Para executar o programa

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

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

  3. Clique no Cancelar o botão para interromper a tarefa. Observe que a aparência da Cancelar botão não altera imediatamente quando você clica nele. O Click evento não ocorre até o My.Application.DoEvents instrução permite o processamento do evento.

    Dica

    O método My.Application.DoEvents não processa os eventos da exatamente a mesma forma como faz o formulário.Por exemplo, esta explicação passo a passo, você deve clicar na Cancelar botão duas vezes.Para permitir que o formulário manipular os eventos diretamente, você pode usar multithreading.Para obter mais informações, consulte Threading (C# e Visual Basic).

Talvez você ache instrutivo para executar o programa com F11 e depurar o código uma linha por vez. Você pode ver claramente como entrada de execução LongTaske reentrada brevemente Form1 cada vez que o PercentDone evento é gerado.

O que aconteceria se, enquanto a execução foi no código do Form1, o LongTask método foi chamado novamente? Na pior das hipóteses, um estouro de pilha pode ocorrer se LongTask foi chamada sempre que o evento foi gerado.

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

Para manipular eventos para um widget diferente

  • Adicione a seguinte linha de código para o Button1_Click procedimento, logo após a linha que lê 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 para o Widget é liberado e o Widget é destruído.

A WithEvents variável pode conter a referência de apenas um objeto ao mesmo tempo, isso se você atribuir uma outra Widget o objeto para mWidget, o anterior Widget eventos do objeto não mais serão tratados. Se mWidget é a única variável de objeto que contém uma referência para o antigo Widget, o objeto é destruído. Se você deseja manipular eventos de várias Widget objetos, use o AddHandler a instrução para processar os eventos de cada objeto separadamente.

Dica

Você pode declarar tantos WithEvents variáveis de medida que você precisam, mas as matrizes de WithEvents variáveis não são suportadas.

Consulte também

Tarefas

Instruções passo a passo: declarando e acionando eventos (Visual Basic)

Outros recursos

Eventos (Visual Basic)