API Timer présentée dans la FAQ - méthode de classe
Bonjour,
Je souhaite utiliser des timers sans devoir utiliser un formulaire.
Pour se faire, j'ai trouvé des sources dans la FAQ Access : http://access.developpez.com/sources...ev#TimerSsForm
Cependant, je ne connais pas avant le lancement de mon programme, le nombre de timers dont j'aurai besoin.
Donc je voudrais encapsuler mes timers dans une classe.
J'ai donc réussi à trouver ce topic : http://www.developpez.net/forums/d77...e/#post4454916 dont la solution est adaptée à Excel mais je n'arrive pas à l'adapter à Access.
Voici mes sources :
APITimer, dans un module de classe
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
'***************************************************************************************
'* MODULE POUR TIMER *
'***************************************************************************************
' Gestion de timer avec renvoi de l'événement à une instance de classe
'***************************************************************************************
' Auteur : Thierry GASPERMENT (Arkham46)
' Le code est libre pour toute utilisation
'***************************************************************************************
Option Explicit
'***************************************************************************************
'* VARIABLES *
'***************************************************************************************
Private gHwnd As Long
Private gTimerStarted As Boolean
'***************************************************************************************
'* EVENEMENTS *
'***************************************************************************************
Public Event OnTimer()
'***************************************************************************************
'* API *
'***************************************************************************************
' Déclaration d'API pour timer
Private Declare Function APISetTimer Lib "user32.dll" Alias "SetTimer" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerProc As Long) As Long
Private Declare Function APIKillTimer Lib "user32.dll" Alias "KillTimer" _
(ByVal hwnd As Long, ByVal uIDEvent As Long) As Long
'***************************************************************************************
'* FONCTIONS *
'***************************************************************************************
' Démarre le timer (interval en ms)
Public Sub StartTimer(Interval As Long)
'*****
' Modification par rapport aux sources données dans le topic.
' Le programme exécute ces deux lignes de codes mais l'évènement n'est jamais déclenché.
'*****
gTimerStarted = (APISetTimer(Application.hWndAccessApp, ObjPtr(Me), Interval, AddressOf Callback_Timer) <> 0)
gHwnd = Application.hWndAccessApp
End Sub
' Arrête le timer ()
Public Sub StopTimer()
If gTimerStarted Then APIKillTimer Application.hWndAccessApp, ObjPtr(Me)
End Sub
Public Sub TimerProc()
On Error Resume Next
RaiseEvent OnTimer
End Sub
Private Sub Class_Terminate()
If gTimerStarted Then StopTimer
End Sub |
Mon module de classe encapsulant les timers :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
Option Compare Database
Option Explicit
Private WithEvents oTimer1 As APITimer
Private intervalInMs As Long
Public Function SetInterval(ByVal inter As Long)
intervalInMs = inter
End Function
Function StartTimer()
Set oTimer1 = New APITimer
oTimer1.StartTimer intervalInMs
End Function
Function StopTimer()
oTimer1.StopTimer
End Function
Private Sub oTimer1_OnTimer()
MsgBox ("test")
End Sub |
Le module standard (ce n'est pas un module de classe) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
Option Explicit
'***************************************************************************************
'* MODULE POUR TIMER *
'***************************************************************************************
' Gestion de timer avec renvoi de l'événement à une instance de classe
'***************************************************************************************
' Auteur : Thierry GASPERMENT (Arkham46)
' Le code est libre pour toute utilisation
'***************************************************************************************
'***************************************************************************************
'* FONCTIONS *
'***************************************************************************************
' Callback_Timer est appelé par les timers à intervalle régulier
' wparam contient la classe qui a initié le timer
Public Function Callback_Timer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As APITimer, ByVal lParam As Long) As Long
' Citation de l'aide de AddressOf :
'Étant donné que l'appelant d'un rappel ne se trouve pas dans votre programme,
'il est important qu'une erreur rencontrée dans la procédure de rappel ne se propage pas
'dans l'appelant. Pour ce faire, insérez l'instruction On Error Resume Next
'au début de la procédure de rappel.
On Error Resume Next
' renvoie l'événement à la classe qui a initié le timer
wParam.TimerProc
End Function |
Et enfin la fonction que j’exécute :
Code:
1 2 3 4 5 6 7
|
Public Function test_print()
Dim timer As ClasseTimer
Set timer = New ClasseTimer
timer.SetInterval (5000)
timer.StartTimer
End Function |
Merci pour votre aide ! :-)