|
|
|
|
|
Dicas
|
|
Visual Basic (ActiveX/Controles/DLL)
|
|
|
Título da Dica: Supere as limitações do componente Timer
|
|
|
|
Postada em 3/9/2003 por Ð@®l@n
O componente timer do VB é limitado a 65000 milisegundos, o que é um pouco mais que um minuto.
Para superarmos essa limitação precisaremos abrir mão do componente Timer e fazer uso de duas API's : SetTimer e KillTimer.
As API's não possuem a limitação de 65000 pois utilizam variáveis LONG para a definição do Timer.
Essas API's em questão são um bom exemplo do uso de uma função de CallBack : Passamos o endereço de uma sub em nossa aplicação para a API e ela chama nossa sub a cada intervalo de tempo determinado.
A declaração das API's pode ficar em um módulo ou em um formulário, mas a função de CallBack, a função que será chamada pela API, precisa ficar em um módulo. Veja a declaração das API's :
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Os parâmetros da função SetTimer são :
hwnd : O handle da janela owner do timer nIDEvent : O ID do timer. Deve ser único para o hwnd, mas diferentes hwnd podem criar timers com o mesmo ID, sem problema uElapse : O tempo em milisegundos lpTimerFunc : Um ponteiro para a função a ser chamada
Vamos considerar um exemplo de um form com 2 botões, um para iniciar o timer outro para desativa-lo. Veja como fica o código :
Private Sub Command2_Click() KillTimer Me.hwnd, 0 End Sub
Private Sub Form_Load()
SetTimer Me.hwnd, 0, 120000, AddressOf TimerProc End Sub
A função AddressOf é utilizada para obter o ponteiro para a função que será chamada pelo timer, a sub TimerProc em nosso exemplo. Vejamos então como fica a sub TimerProc :
Public Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) MsgBox "teste" End Sub
Ela recebe da API os mesmos parâmetros do timer, para poder identifica-lo. Na sub em questão basta realizarmos a tarefa que desejamos ou chamar outra sub que a realize.
|
|
|
|
|