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
Coloque o seguinte código em
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
A
WithEvents
palavra-chave especifica que a variávelmWidget
é 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 emForm1
porqueWithEvents
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 oLongTask
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
Selecione
mWidget
na lista suspensa à esquerda no Editor de códigos.Selecione o
PercentDone
evento na lista suspensa à direita. O Editor de Códigos abre o procedimento demWidget_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.
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 umLabel
controle. ODoEvents
método permite que o rótulo seja repintado e também dá ao usuário a oportunidade de clicar no botão Cancelar .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
Selecione (Eventos do Form1) na lista suspensa à esquerda no Editor de Códigos.
Selecione o
Load
evento na lista suspensa à direita. O Editor de Códigos abre o procedimento deForm1_Load
evento.Adicione o seguinte código para o procedimento de
Form1_Load
evento para criar oWidget
: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
Pressione F5 para colocar o projeto no modo de execução.
Clique no botão Iniciar tarefa . Cada vez que o
PercentDone
evento é gerado, o rótulo é atualizado com a porcentagem da tarefa concluída.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 oMy.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 dizmWidget.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
.