Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 AddHandler e Handles.
Para lidar com o evento PercentDone da classe Widget
Coloque o seguinte código em
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanA
WithEventspalavra-chave especifica que a variávelmWidgeté usada para lidar com 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 emForm1porque as variáveisWithEventsdevem 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 oLongTaskmé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
mWidgetna lista suspensa à esquerda no Editor de Código.Selecione o evento
PercentDoneda 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
mWidget_PercentDonemanipulador de 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 SubSempre que o
PercentDoneevento é acionado, o procedimento de evento exibe a porcentagem concluída em umLabelcontrole. ODoEventsmé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 para o
Button2_Clickmanipulador de 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 evento Button2_Click será executado assim que a instrução DoEvents permitir que o processamento de eventos ocorra. A variável mblnCancel de nível de classe é definida como True, e o mWidget_PercentDone evento, em seguida, testa-a e define o ByRef Cancel argumento como True.
Conectando uma variável WithEvents a um objeto
Form1 agora está configurado para lidar com os eventos de um Widget objeto. Tudo o que resta é encontrar um Widget em algum lugar.
Quando você declara uma variável WithEvents em tempo de design, nenhum objeto é associado a ela. Uma WithEvents variável é exatamente como 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
Loadda lista suspensa à direita. O Editor de Códigos abre o procedimento do eventoForm1_Load.Adicione o seguinte código para o
Form1_Loadprocedimento de 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
Ao ser 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 invocar o método LongTask
Adicione o seguinte código ao
Button1_Clickmanipulador de 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 é 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 ele parou porque mblnCancel foi definido como True. A porcentagem concluída é atualizada somente 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
PercentDoneevento é gerado, o rótulo é atualizado com o percentual da tarefa concluída.Clique no botão Cancelar para interromper a tarefa. Observe que a aparência do botão Cancelar não é alterada imediatamente quando você clica nele. O evento
Clicknão pode acontecer até que a declaraçãoMy.Application.DoEventspermita o processamento de eventos.Observação
O
My.Application.DoEventsmé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 o multithreading. Para obter mais informações, consulte Managed Threading.
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 LongTaske, 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 do Form1, o método LongTask 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 em Button1_Click executar isso sempre que clicar no botão.
Para manipular eventos para um widget diferente
Adicione a seguinte linha de código ao
Button1_Clickprocedimento, 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 sempre que o botão é clicado. Assim que o LongTask método for concluído, a referência ao Widget método será liberada e a Widget será destruída.
Uma WithEvents variável pode conter apenas uma referência de objeto de cada vez, portanto, se você atribuir um objeto diferente Widget , mWidgetos eventos 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 forem necessárias, mas não há suporte para matrizes de WithEvents variáveis.