Avançar para o conteúdo principal

Delegates


Um delegate pode ser definido como um ponteiro para uma função. O delegate encapsula o endereço de uma função no seu código.

As funções associadas a eventos são um exemplo da utilização de delegates, quando o evento “acontece” é chamada a função para a qual o delegate aponta.

Os delegates podem agrupar funções que são chamadas em conjunto.


Para utilizarmos delegates começamos por definir um:
Private Delegate Sub MinhaFuncao()

Agora vamos criar a função que será associada ao delegate:
    Private SubEscreveDebug()
        Debug.Print("Olá mundo")
    End Sub

De seguida criamos uma variável do tupo do delegate e associamos à função:
     Dim funcDel As MinhaFuncao 

Depois associamos a variável à respectiva função:
     funcDel = New MinhaFuncao(AddressOf EscreveDebug)

Por fim executamos a função através do delegate:
     funcDel.Invoke()


Delegates Multicast
Os delegates multicast permitem criar uma sequência de funções a serem chamadas quando o delegate é invocado.

De momento não é possível definir a ordem em que são executadas somente que estas são executadas.

Para começar definimos mais uma função:
    Private SubEscreveDebug2()
        Debug.Print("Olá mundo, outra vez")
    End Sub

De seguida criamos outra variável para associar a esta função:
    Dim funcDel2 As MinhaFuncao

Associamos:
    funcDel2 = New MinhaFuncao(AddressOfEscreveDebug2)

Agora criamos um delegate multicast que vai invocar os outros dois:
    Dim funcDelTodas As [Delegate]

Para isso temos de associar este aos outros dois:
    funcDelTodas = MulticastDelegate.Combine(funcDel, funcDel2)

Por fim, executamos:
    funcDelTodas.DynamicInvoke(Nothing)

Com os delegates podemos criar diferentes versões de uma função e associar ao delegate a versão que pretendemos utilizar de acordo com o desenvolvimento da aplicação.

Os delegates também permitem passar uma função para outra como um parâmetro.

Por exemplo podemos ter uma função chamada operador que invoca um delegate passado por parâmetro a dois valores para executar uma operação.

Declaração da função delegate:
   Public Delegate Function Operador(ByVal x As Double, ByVal y As Double) As Double

Assim podemos definir a seguinte operação:
    FunctionSoma(ByVal x AsDouble, ByVal y As Double) As Double
        Return x + y
    End Function

E ainda outra assim:
    FunctionSubtrai(ByVal x AsDouble, ByVal y As Double) As Double
        Returnx - y
    End Function

Agora podemos criar a função calcular que recebe o delegate a chamar bem como os parâmetros a passar ao delegate:
    FunctionCalcular(ByVal op AsOperador, ByValx As Double, ByVal y As Double) As Double
        Dim devolver As Double

        devolver = op.Invoke(x, y) 'invoca a função associada

        Return devolver
    End Function

Para testar este conceito criamos um formulário assim:

Agora podemos chamar a função calcular a partir do clique no botão:
        Dim x, y As Integer

        x = Me.TextBox1.Text
        y = Me.TextBox2.Text

        Me.Label3.Text = Calcular(AddressOf Soma, x, y)

        Me.Label4.Text = Calcular(AddressOf Subtrai, x, y)


O projeto pode ser descarregado aqui.

Comentários

Mensagens populares deste blogue

Upgrade do Windows Home para Pro sem formatar

 Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso. Finalmente conseguinte seguindo estes passos: - seguinte estes passos  utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key; - após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar; - agora tem o Windows Pro mas não está ativado, assim fui ao site urcdkeys  onde comprei uma chave para o Windows Pro por menos de €20; - com essa chave voltei a funcionalidade Change the product key e ativei o Windows; - e pronto, Windows Pro ativado sem formatar ou reinstalar. Importante : eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.

Encriptar e Desencriptar

Com o .Net podemos facilmente codificar e descodificar mensagens através do namespace Cryptography. Neste post vamos estudar um programa que encripta um texto com base numa palavra passe e posteriormente descodifica a mensagem. Começamos por criar uma função para encriptar: string codifica(string mensagem, string ppasse) {   //este vector vai ficar com a mensagem encriptada   byte [] mensagem_codificada;  //vamos utilizar codificação UTF8   System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();   // Vamos utilizar o algoritmo MD5 para fazer o Hash da palavra passe   MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();   //Agora podemos então fazer o hash da palavra passe   byte[] TDESChave = HashProvider.ComputeHash(UTF8.GetBytes(ppasse));   //De seguida vamos escolher o algoritmo de encriptação   TripleDESCryptoServiceProvider TDESAlgoritmo = new TripleDESCryptoServiceProvider();   //Confi...

PONG em Flash AS3.0

Mais um pequeno jogo para demonstrar algumas das funcionalidades do AS3.0. Para este exemplo vamos implementar uma versão do Pong. Para este Pong vamos criar a possibilidade de acelerar a bola com a raqueta e, para tornar o jogo mais difícil, quando se atingir uma determinada pontuação fazemos aparecer uma parede no meio do campo de jogo. O código é muito parecido com o jogo do post anterior, mas um pouco mais complicado. Para controlar a nossa raqueta utilizamos a seguinte função: function teclado(e:KeyboardEvent):void{ dir_j1=0; if (e.keyCode == Keyboard.UP){ if(jogador1.y>0) jogador1.y -=5; dir_j1=-5; } if (e.keyCode == Keyboard.DOWN){ if(jogador1.y<370) jogador1.y +=5; dir_j1=5; } } Agora está mais simples pois só percorremos as linhas, ou seja, a coluna nunca muda. A raqueta que é controlada pelo computador depende do seguinte código: function movepc():void { if (bola.y>jogador2.y) jogador2.y = jogador2.y + velocidade_y; if (bola.y<jogador2.y) joga...