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
Selecione mWidget o esquerdo-lista suspensa na o Editor deCódigo.
Selecione o PercentDone evento o direito-lista suspensa. O o Editor deCódigo abre o mWidget_PercentDoneprocedimentodeevento.
Observaçã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.
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.
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
Selecione (form1 Events) o esquerdo-lista suspensa no o Editor deCódigo.
Selecione o Load evento o direito-lista suspensa. O o Editor deCódigo abre o Form1_Loadprocedimentodeevento.
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
Pressione F5 para colocar o projeto no modo de execução.
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.
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çã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çã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)