Pesquisar este blog

domingo, 27 de outubro de 2013

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO - ADDRESSOF

AddressOf


    Operador unário que transfere o endereço de memória de um procedimento para uma função API que espera receber o primeiro do procedimento em um de seus argumentos, utilizando esta sintaxe:

AdderessOf NomeDoProcedimento

Onde,
  •  NomeDoProcedimento: argumento obrigatório, especifica o nome de um procedimento existente em um módulo padrão do projeto onde a  chamada é efetuada, cujo endereço deve ser passado para a API.
As seguintes considerações são válidas para o operador AddressOf: 
  • AddressOf é normalmente empregada em funções de call-back: uma função API existente em uma DLL, que recebe o endereço do procedimento a ser executado em um momento posterior;
  • AddressOf pode aparecer apenas em listas de argumentos de função – jamais como uma linha de código que atribui seu valor a uma variável;
  • Para capturar o endereço de memória de um procedimento utilizando a instrução AddressOf, atribua o resultado a um argumento de função do tipo Long;
  • O emprego de AddressOf pode provocar resultados imprevisíveis, de depuração difícil ou até mesmo impossível, devido a ambos os procedimentos (API em DLL e procedimento em VBA) executaram-se no mesmo processo do ambiente de desenvolvimento.
    • Para criar protótipos de funções que empregam caal-back em DLLs, você deverá utilizar o Microsoft Visual C++ ou ferramentas similares, utilizando as convenções de chamada de procedimento __ stdcall (__cdecl não funciona com AddressOf);
    • Empregue sempre uma instrução On Error Resume Next para evitar que qualquer erro proveniente do procedimento de call-back,escrito em VBA, se propague no procedimento externo (API). 

Exemplo: O exemplo a seguir demonstra como empregar as API do Windows SetTimer e KillTimer para criar um cronômetro a partir de qualquer aplicativo COM compatível (como Visual Basic, Access, Excel etc.). O cronômetro é disparado utilizando-se a função SetTimer e passando-lhe o endereço de um procedimento que deverá ser chamado quando o intervalo de tempo desejado tiver sido atingido, o que é feito utilizando-se a função AddressOf do VBA.

Declare Function SetTimer Lib “user32” (ByVal hwnd As Long, ByVal nlDEvent As Long, ByVal uElapse As Long, ByVal IpTimerFunc As Long) As Long

Declare Function KillTimer Lib “user32” (ByVal hwnd As Long, ByVal nlDEvent As Long) As Long

Dim IngTimerID As Long

Public Sub AtivaCronômetro(Optional IngTempo As Long = 5000)

‘IngTempo = Tempo em milisegundos
IngTimerID = SetTimer(0,0,IngTempo,AddressOf Minha função)

End Sub

Public Sub MinhaFunção(ByVal hwnd&, ByVal msg&, ByVal ID&, ByVal CurrentTime&)

Call KillTimer(0, IngTimerID)
MsgBox “O evento ocorreu após o tempo especificado!”

End Sub

    Para verificar o funcionamento do procedimento de Call-back, basta efetuar uma chamada ao procedimento AtivaCronômetro() passando-lhe um valor em milisegundos (o valor padrão é de 5 milesegundos). Após o intervalo fornecido (5 segundos), você obterá uma MsgBox indicando que o tempo esperado já passou.

Até a Próxima!!

Nenhum comentário:

Postar um comentário