Instruções passo a passo: tratando 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. O Visual Basic fornece outras técnicas para trabalhar com eventos. Como um exercício, você pode modificar este exemplo para usar as instruções e AddHandler
instruçõesHandles
.
Para manipular o evento PercentDone da classe Widget
Posicione 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 os eventos de um objeto. Especifique o tipo de objeto fornecendo o nome da classe da qual o objeto será criado.A variável
mWidget
é declarada porqueForm1
as variáveis devem ser deWithEvents
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ê declara uma variável usando WithEvents
, o nome da variável aparece na lista suspensa à esquerda do Editor de Código da classe. Quando você seleciona mWidget
, os Widget
eventos da classe aparecem na lista suspensa à direita. Selecionar 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 identificar um evento
Selecione
mWidget
na lista suspensa à esquerda no Editor de Código.Selecione o evento
PercentDone
da lista suspensa à direita. O Editor de Códigos abre o procedimento do eventomWidget_PercentDone
.Observação
O Editor de Código é útil, mas não necessá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 eventos do
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 é acionado, o procedimento de evento exibe a porcentagem concluída em umLabel
controle. ODoEvents
método permite que o rótulo seja repinto e também dá ao usuário a oportunidade de clicar no botão Cancelar.Adicione o seguinte código ao manipulador de eventos
Button2_Click
: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 o testa e define o ByRef Cancel
argumento como True
.
Conectando uma variável WithEvents a um objeto
Form1
agora está configurado para manipular os 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 é igual a qualquer outra variável de objeto. Você precisa 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 form1) na lista suspensa à esquerda no Editor de Código.
Selecione o evento
Load
da lista suspensa à direita. O Editor de Códigos abre o procedimento do eventoForm1_Load
.Adicione o seguinte código para o procedimento de
Form1_Load
evento para criar: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 objeto Widget
e conecta seus eventos aos procedimentos de evento associados a mWidget
. A partir desse ponto, sempre que o evento Widget
for gerado PercentDone
, o procedimento de evento mWidget_PercentDone
será executado.
Para chamar o método LongTask
Adicione o seguinte código ao manipulador de eventos do
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 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 é gerado uma vez a cada um terço de segundo. Cada vez que o evento é acionado, o procedimento de mWidget_PercentDone
evento é executado.
Quando LongTask
terminar, mblnCancel
será testado para ver se LongTask
terminou normalmente ou se parou porque foi definido como mblnCancel
True
. O percentual concluído é atualizado apenas no caso anterior.
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 é acionado, o rótulo é atualizado com o percentual da tarefa concluída.Clique no botão Cancelar para parar a tarefa. Observe que a aparência do botão Cancelar não é alterada imediatamente quando você clica nele. O
Click
evento não pode acontecer até que a instrução permita oMy.Application.DoEvents
processamento de eventos.Observação
O método
My.Application.DoEvents
não processa eventos exatamente da mesma forma que o formulário o faz. Por exemplo, neste passo a passo, você deve clicar duas vezes no botão Cancelar. Para habilitar o formulário para manipular os eventos diretamente, você pode usar o multithreading. Para obter mais informações, confira Threading gerenciado.
Você pode achar instrutivo executar o programa com F11 e percorrer o código de uma linha de cada vez. Você pode ver claramente como a execução entra LongTask
e, em seguida, reentra Form1
brevemente cada vez que o PercentDone
evento é acionado.
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 poderia ocorrer se LongTask
fosse chamado toda vez que o evento fosse acionado.
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 fazer Button1_Click
isso toda vez que clicar no botão.
Para manipular eventos para um widget diferente
Adicione a seguinte linha de código ao
Button1_Click
procedimento, imediatamente anterior à 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 for concluído, a referência ao Widget
método será liberada e ela Widget
será destruída.
Uma variável WithEvents
pode conter apenas uma referência de objeto por vez, portanto, se você atribuir um objeto diferente Widget
, os eventos mWidget
do objeto anterior Widget
não serão mais tratados. Se mWidget
for a única variável de objeto que contém uma referência ao antigo Widget
, o objeto será destruído. Se você quiser manipular eventos de vários Widget
objetos, use a AddHandler
instrução para processar eventos de cada objeto separadamente.
Observação
Você pode declarar quantas WithEvents
variáveis precisar, mas não há suporte para matrizes de WithEvents
variáveis.