Share 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. Visual Basic fornece outras técnicas para trabalhar com eventos. Como exercício, você pode modificar este exemplo para usar as AddHandler instruções and Handles .

Para manipular 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 manipular eventos de um objeto. Você especifica o tipo de objeto fornecendo o nome da classe a partir da qual o objeto será criado.

    A variável mWidget é declarada em Form1 porque WithEvents as variáveis 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ê declarar uma variável usando WithEvents, o nome da variável aparecerá na lista suspensa à esquerda do Editor de Códigos da classe. Quando você seleciona mWidget, os 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. Todos os procedimentos de evento associados a uma WithEvents variável recebem o nome da variável como um prefixo.

Para manipular um evento

  1. Selecione mWidget na lista suspensa à esquerda no Editor de códigos.

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

    Nota

    O Editor de Códigos é útil, mas não obrigató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 mWidget_PercentDone 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 é gerado, o procedimento de evento exibe a porcentagem concluída em um Label controle. O DoEvents método permite que o rótulo seja repintado e também dá ao usuário a oportunidade de clicar no botão Cancelar .

  4. Adicione o seguinte código para o manipulador de Button2_Click 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 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 a testa e define o ByRef Cancel argumento como True.

Conectando uma variável WithEvents a um objeto

Form1 agora está configurado para manipular 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 é como qualquer outra variável de objeto. Você tem que 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 do Form1) na lista suspensa à esquerda no Editor de Códigos.

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

  3. Adicione o seguinte código para o procedimento de Form1_Load 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, o Visual Basic cria um Widget objeto e conecta seus eventos aos procedimentos de evento associados ao mWidget. A partir daí, sempre que o Widget evento for suscitado PercentDone , o procedimento do mWidget_PercentDone evento é executado.

Para chamar o método LongTask

  • Adicione o seguinte código ao manipulador de Button1_Click 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 é levantado uma vez a cada um terço de segundo. Cada vez que o evento é gerado, o procedimento do mWidget_PercentDone evento é executado.

Quando LongTask é feito, mblnCancel é testado para ver se LongTask terminou normalmente, ou se parou porque mblnCancel foi definido como True. A percentagem concluída é atualizada apenas no primeiro caso.

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 a porcentagem 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 muda imediatamente quando você clica nele. O Click evento não pode acontecer até que a instrução permita o My.Application.DoEvents processamento do evento.

    Nota

    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 multithreading. Para obter mais informações, consulte Threading gerenciado.

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

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 pode ocorrer se LongTask for chamado toda vez que o evento for gerado.

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 fazer isso toda vez que você clicar no Button1_Click 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 cada vez que o botão é clicado. Assim que o LongTask método é concluído, a referência ao é liberada Widget e o Widget é destruído.

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

Nota

Você pode declarar quantas WithEvents variáveis precisar, mas matrizes de variáveis não são suportadas WithEvents .

Consulte também