O Vb. Remetente líquido e parâmetros de evento e

No VB6, uma sub-rotina de eventos, como Button1_Click, era muito menos complicada porque o sistema chamava a sub-rotina estritamente de nome. Se um evento Button1_Click existisse, o sistema o chamou. É direto e direto.

Mas no VB.NET, existem duas grandes atualizações que tornam VB.NET SOOP carregado (que é "OOP" para Programação Orientada a Objetos).

  1. A cláusula "Handles" controla se o sistema chama a sub-rotina, não o nome.
  2. Os parâmetros remetente ee são passados ​​para a sub-rotina.

Uso de Parâmetros

Vejamos um exemplo simples para ver a diferença que os parâmetros fazem no VB.NET.

Sub-botão privado1_Click ( 

 Remetente ByVal como sistema. Objeto,

 ByVal e As System. EventArgs

 ) Botão Alças1.

 'Seu código vai aqui

End Sub

As sub-rotinas de eventos sempre recebem um objeto "remetente" e um parâmetro "e" do sistema EventArgs. Como o parâmetro EventArgs é um objeto, ele suporta quaisquer propriedades e métodos necessários. Por exemplo, a antiga sub-rotina de eventos VB6 MouseMove usada para receber quatro parâmetros:

instagram viewer
  • Botão como número inteiro
  • Shift As Inteiro
  • X como único
  • Y como solteiro

Quando os mouses mais avançados surgiram com mais botões, o VB6 teve um problema real de suporte. O VB.NET passa apenas um parâmetro MouseEventArgs, mas suporta muito mais propriedades e métodos. E cada um deles são objetos que suportam ainda mais. Por exemplo, o e. A propriedade Button contém todas essas propriedades:

  • Esquerda
  • Meio
  • Certo
  • Nenhum
  • XButton1
  • XButton2

Se alguém inventar um mouse "trancendental" com um botão "virtual", o VB.NET precisará atualizar o .NET Framework apenas para suportá-lo e, como resultado, nenhum código anterior será quebrado.

Existem várias tecnologias .NET que dependem absolutamente desses parâmetros. Por exemplo, como seu PC geralmente possui apenas uma única tela para exibir gráficos, seu código precisa mesclar os gráficos criados na mesma imagem usada pelo Windows. Por esse motivo, um único objeto "gráfico" deve ser compartilhado. A principal maneira que seu código é capaz de usar esse objeto "graphics" é usar o parâmetro e que é passado para o evento OnPaint com o objeto PaintEventArgs.

Substituições protegidas Sub OnPaint (

 ByVal e As System. Janelas. Formulários. PaintEventArgs)

 Dim g As Graphics = e. Gráficos

Outros exemplos

O que mais você pode fazer com esses parâmetros? Para ilustrar, suponha que você queira descobrir se uma sequência, talvez algo que você inseriu em uma caixa de texto, existe em qualquer uma das coleções de outras caixas de texto quando você clica em uma. Você pode codificar algumas dezenas de sub-rotinas praticamente idênticas para cada caixa de texto:

Se TextBox42.Text. Índice de(

 Seqüência de pesquisa. Texto) = -1 

 Então não encontrado. Texto = 

 "Não encontrado"

Mas é muito mais fácil codificar apenas um e deixá-lo lidar com todos eles. O parâmetro remetente revelará qual caixa de texto foi clicada.

Private Sub FindIt (

 Remetente ByVal como sistema. Objeto,

 ByVal e As System. EventArgs

 ) Manipula TextBox1.Enter, 

 TextBox2.Enter, 

... e assim por diante.. .

 TextBox42.Enter

 Dim myTextbox As TextBox

myTextbox = remetente

 Dim IndexChar As Inteiro = 

 myTextbox. Texto. Índice de( 

 Seqüência de pesquisa. Texto)

 Se IndexChar = -1 Então _

 Não encontrado. Texto = "Não encontrado" _

 Outro _

 Não encontrado. Text = "Encontrei!"

 End Sub

Recentemente, um programador me pediu uma maneira melhor de "excluir a linha que foi clicada em qualquer uma das seis listas especificadas". Ele trabalhava em algumas dezenas de linhas de código que simplesmente me confundiam. Mas, usando remetente, era realmente bastante simples:

Private Sub ListBox_Click ( 

 Remetente ByVal como objeto, 

 ByVal e As System. EventArgs

 ) Manipula ListBox1.Click, ListBox2.Click

 Dim myListBox As New ListBox

 myListBox = remetente

 myListBox. Itens. RemoveAt (myListBox. SelectedIndex)

End Sub

Mais um exemplo para esclarecer a questão é uma pergunta enviada por Pierre na Bélgica. Pierre estava testando a igualdade de Button1 e remetente usando o É operador para objetos:

Se o remetente for Button1, então ...

Isso é sintaticamente correto, pois remetente e Button1 são objetos que podem ser referenciados. E como o remetente é realmente idêntico ao Button1, por que não funciona?

A resposta depende de uma palavra-chave encontrada um pouco antes na declaração. Primeiro, vamos verificar a documentação da Microsoft para o É operador.

Visual básico compara duas variáveis ​​de referência de objeto com o operador Is. Este operador determina se duas variáveis ​​de referência se referem à mesma instância do objeto.

Observe que o remetente é passado ByVal. Isso significa que uma cópia do Button1 é passada, não o próprio objeto real. Portanto, quando Pierre testa para ver se remetente e Button1 são a mesma instância, o resultado é False.

Para testar se o Botão1 ou o Botão2 foi clicado, você deve transformar o remetente em um objeto Button real e, em seguida, testar uma propriedade desse objeto. O texto geralmente é usado, mas você pode testar um valor em Tag ou até na propriedade Location.

Este código funciona:

Dim myButton As Button

myButton = remetente

Se myButton. Text = "Button1" Então

instagram story viewer