Partilhar via


Passo a passo: Manipulação de eventos (Visual Basic)

Este é o segundo dos dois tópicos que demonstram como trabalhar com eventos. O primeiro tópico, passo a passo: Declaração 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 Widgetexemplo declasse usa tradicional de evento-instruções de tratamento. 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 do PercentDone da classede 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 tratar eventos de um objeto. Especifique o tipo de objeto , fornecendo o nome da classe da qual o objeto será criado.

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

    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 aparece na esquerda drop-para baixo a lista da classe o Editor deCódigo. Quando você seleciona mWidget, o Widgetdaclassede eventos aparecem na direita suspensa-lista. A seleção de um evento exibe o eventocorrespondenteprocedimento, com o prefixo mWidget e um sublinhado. Tudo 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 o esquerdo-lista suspensa na o Editor deCódigo.

  2. Selecione o PercentDone evento o direito-lista suspensa. O o Editor deCódigo abre o mWidget_PercentDoneprocedimentodeevento.

    ObservaçãoObservação

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

  3. Add the following code to the mWidget_PercentDone event handler:

    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 PercentDoneevento é gerado, oprocedimento de eventoexibe a porcentagem concluída em um Label de controle. O DoEvents método permite que o rótulo redesenhar e também oferece ao usuário a oportunidade de clique do Cancelar botão.

  4. Adicionar o seguinte código para o Button2_Clickmanipulador deevento :

    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 demonstrativo de processamento de evento permite que. A classe- variávelde nívelmblnCancel é definida como Truee o mWidget_PercentDoneevento , em seguida, testa e define o ByRef Canceloargumento para True.

Conectando a uma variável WithEvents para um objeto

Form1agora está configurado para lidar com um Widget objetoeventos do. Tudo que permanece é encontrar um Widget em algum lugar.

Quando você declara uma variáveldeWithEvents em tempo de design, nenhum objeto é associado ao proprietário. A deWithEventsvariável é assim como qualquer outro objetovariável. Você precisa criar um objeto e atribui uma referência a ele com o WithEvents variável.

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

  1. Selecione (form1 Events) o esquerdo-lista suspensa no o Editor deCódigo.

  2. Selecione o Load evento o direito-lista suspensa. O o Editor deCódigo abre o Form1_Loadprocedimentodeevento.

  3. Adicionar o seguinte código para o Form1_Loadprocedimento deeventopara 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 objeto e conecta seus eventos para os procedimentos de evento associados com mWidget. Partir desse ponto, sempre que o Widget aumenta sua PercentDoneevento, o mWidget_PercentDoneprocedimento deeventoé executado.

Para chamar o métodode LongTask

  • Add the following code to the Button1_Click event handler:

    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 LongTaskmétodo é chamado, o rótulo que exibe a porcentagem concluída deve ser inicializado e a classe-nível Booleanosinalizar para o método de cancelamento deve ser definido como False.

LongTaské chamado com a duração de uma tarefa de 12.2 segundos. O PercentDoneoevento é disparado uma vez cada um-terço de um segundo. Cada vez que o evento é disparado, o mWidget_PercentDoneprocedimento deeventoé executado.

Quando LongTask for feito, mblnCancel é testado para ver se LongTask foi encerrado normalmente, ou se ele parou 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 o Iniciar tarefa botão. Cada vez que o PercentDone evento é gerado, o rótulo é atualizado com a porcentagem da tarefa for concluída.

  3. Clique o 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 Clickevento não ocorre até o My.Application.DoEventspermite que ademonstrativo processamento do evento .

    ObservaçãoObservação

    The My.Application.DoEvents method does not process events in exactly the same way as the form does. 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. For more information, see Threading (C# e Visual Basic).

Talvez você ache instrutivo para executar o programa com F11 e a etapa através do código uma linha por vez. Você pode ver claramente como entra em execução LongTaske então brevemente re-entra Form1 cada vez que o PercentDone evento é gerado.

O que aconteceria se, durante a execução foi novamente 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 foram chamadas sempre que o evento foi gerado.

Você pode fazer com que a variávelmWidget para manipular eventos para um diferente Widgetoobjeto , 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

  • Adicionar 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 a Widget é liberado e o Widget é destruída.

A WithEventsvariável pode conter apenas uma referência de objeto por vez, portanto, se você atribuir uma outra Widgetoobjeto para mWidget, anterior Widgeteventos doobjetonão serão tratados. Se mWidget é o único objeto variável 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 AddHandlerdedemonstrativo para eventos do processo de cada objeto separadamente.

ObservaçãoObservação

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

Passo a passo: Declarando e disparando eventos (Visual Basic)

Outros recursos

Eventos (Visual Basic)