IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

API Timer présentée dans la FAQ - méthode de classe


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Par défaut 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 : 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
    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
     
     
    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 : 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
    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
     
    Public Function test_print()
           Dim timer As ClasseTimer
           Set timer = New ClasseTimer
           timer.SetInterval (5000)
           timer.StartTimer
    End Function
    Merci pour votre aide ! :-)

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Timer étant un membre de la bibliothèque VBA, peut-être que le nom de ta variable objet pose un problème dans ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function test_print()
           Dim timer As ClasseTimer
           Set timer = New ClasseTimer
           timer.SetInterval (5000)
           timer.StartTimer
    End Function
    Essaie en l'appelant oTimer au lieu de timer.

    A+

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/12/2008, 11h59
  2. [POO] utiliser une méthode présente dans une autre classe
    Par arnaudperfect dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2007, 14h23
  3. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  4. [VB6] Api pour supprimer dans un fichier INI
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/02/2003, 08h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo