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
Mon module de classe encapsulant les timers :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Le module standard (ce n'est pas un module de classe) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Et enfin la fonction que j’exécute :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci pour votre aide ! :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager