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

Access Discussion :

[VBA] Module de classe et évènement


Sujet :

Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut [VBA] Module de classe et évènement
    J'essaie de faire un substitut d'un Contrôle auxquel on ajouterait des propriétés et (c'est là le pb) un comportement prédéfinit.

    Je me retrouve avec mon module de classe "CommandQuit". Dans un formulaire, je définis un CommandButton. Dans le Form_Load du formulaire, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private m_oCmdQuit As CommandQuit
     
    Private Sub Form_Load()
        Set m_oCmdQuit = New CommandQuit
        m_oCmdQuit.xCommandButton = cmdTest
    End Sub
    Et le module de classe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private xCmd As CommandButton
    Const cImgFolder As String = "\Commun\Images\"
     
    Property Let xCommandButton(cmd As CommandButton)
        Set xCmd = cmd
        Debug.Print cmd.Name & " est xCommandButton"
     
        'Initialiser XCmd
        xCmd.Picture = CurrentProject.Path & cImgFolder & "x.bmp"
        xCmd.Height = 261  '=0.46cm
        xCmd.Width = 261  '=0.46cm
        xCmd.OnClick = "=testX()" '<-- Le problème.
    End Property
    J'aimerais que testX() soit définit dans le module de classe mais évidemment, cmdTest, alias xCmd du module, ne peut pas la voir là. Une fois les propriétés définient, je ne suis plus liée à ma variable m_oCmdQuit.

    Idée 1 : Trouver un moyen de faire référence encore à l'instance (plus d'idée donc next).

    Idée 2 : Définir testX comme une fonction non liée à une instance de la classe (une fonction "Static" pour les habitués de C# et autres langages). Toujours pas résolu... Est-ce seulement possible avec VBA?

    Idée 3 : Définir testX dans un module standard. Ça marche. C'est presqu'invisible quand on utilise la classe (ok cool)... mais je me demande encore si y'a moyen de faire mieux, surtout que ça limite pas mal ce que je peux faire par la suite.

    Vous avez d'autres pistes? :-)

    Tout ça est un p'tit exercice pour le moment : l'idée finale est de créer un module de classe "Barre de navigation d'enregistrement" où y'aurait plus qu'à placer 6 contrôles (4 boutons, 1 textbox et 1 label pour le "sur xxx") sur un form et les liés à la classe pour qu'ils fassent leur travail comme des grands.

    Merci!
    Caroline
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Re: [VBA] Module de classe et évènement
    Bonsoir,
    Citation Envoyé par Caroline1
    Vous avez d'autres pistes? :-)
    Le remède tout trouvé est le mot clé WithEvents.

    Citation Envoyé par Aide en ligne VBA
    {Dim | Public | Private} [WithEvents] <varname> As <type>

    WithEvents.
    Mot clé indiquant que l'argument <varname> est une variable objet utilisée pour répondre aux événements déclenchés par un objet ActiveX. Valide uniquement dans les modules de classe.
    Vous pouvez déclarer autant de variables distinctes que vous le souhaitez avec le mot clé WithEvents, mais vous ne pouvez l'utiliser pour créer des tableaux.
    Les mots clés New et WithEvents ne peuvent être utilisés ensemble.
    Et le module de classe est :
    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
    Private WithEvents xCmd As CommandButton
    Const cImgFolder As String = "\Commun\Images\"
     
    Property Let xCommandButton(cmd As CommandButton)
     
        ' Cette affectation permet à la classe de réagir aux événements de cmd
        ' via des procédures événementielles privées préfixées par xCmd_
        Set xCmd = cmd
     
        Debug.Print cmd.Name & " est xCommandButton"
     
        'Initialiser XCmd
        xCmd.Picture = CurrentProject.Path & cImgFolder & "x.bmp"
        xCmd.Height = 261  '=0.46cm
        xCmd.Width = 261  '=0.46cm
    End Property
     
    Private Sub xCmd_Click()
     
        ' implémenter la fonction ICI
        '"=testX()" ' --> plus de problème.
     
    End Sub
     
    Private Sub Class_Terminate()
        Set xCmd = Nothing
    End Sub
    J'en fais un usage intensif !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut Mouhahaha, trop simple!
    Mouhahaha! C'est trop simple : je dé-commente l'essai numéro 23521 ("Private Sub xCmd_Click()" définit dans la classe) et j'ajoute WithEvents à la déclaration. . Cool.

    Mais je dois avoir les idées embrouillées là. J'ai beau partir d'un projet tout propre et juste copier directement le code de ton post, l'évènement click ne se lance jamais.

    Y'a des références/options/etc etc à activer pour que WithEvents (j'allais écrire Witch, lol) se lance?

    Je reviens la-dessus demain matin. Commence à être tard. Merci pour ta réponse! Tu m'as appris un truc super important. Reste à bidouiller avec. :-)

    Caroline
    Y'a des tags [Presque résolu]? 8)
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  4. #4
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut

  5. #5
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut Re: Mouhahaha, trop simple!
    Citation Envoyé par Caroline1
    Y'a des références/options/etc etc à activer pour que WithEvents (j'allais écrire Witch, lol) se lance?
    slt,

    Non non c'est pas une référence
    Il faut que dans ton bouton tu ais [procédure événementielle] dans la propriété de l'événement, même si tu n'as pas de code pour l'événement dans ton formulaire.

    tu peux le rajouter dans le xCommandButton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        cmd.onclick = "[Procédure événementielle]"
    (Pour Access en Français bien sûr)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut Re: Mouhahaha, trop simple!
    Citation Envoyé par Arkham46
    Il faut que dans ton bouton tu ais [procédure événementielle] dans la propriété de l'événement
    Arf... ben oui! J'adore commencer une journée comme ça! Ça marche!!
    Merci Arkham, merci JBO. Et merci aussi à Maxence pour avoir pris le temps de lire :-).

    Bonne journée!
    Caroline
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Programmation événementielle WithEvents: SUB RELAIS !
    Bonjour à tous,

    Je rebondis sur la remarque d'Arkham46 parce qu'elle me semble de première importance pour les développeurs Access qui s'intéressent à la gestion d'événements au moyen de la technique du WithEvents.
    Citation Envoyé par Arkham46
    Il faut que dans ton bouton tu ais [procédure événementielle] dans la propriété de l'événement, même si tu n'as pas de code pour l'événement dans ton formulaire.
    LE PROBLEME (constaté sous Access 2000):
    Si on veut traiter un événement d'un objet Access (Form, Control...) en dehors du module de code de l'objet ciblé (ou de son container), alors on utilise une référence d'objet WithEvents.
    MAIS, cette référence d'objet "externe" ne "reçoit" l'événement qu'à condition qu'il existe une procédure événementielle dans le module de code de l'objet ciblé.

    SOLUTION (pas très satisfaisante):
    Dans le module de code de l'objet (ou de son container), il faut créer une procédure événementielle pour tous les événements que l'on souhaite "scruter" à l'extérieur.
    Cette procédure événementielle, si elle est vide, peut s'envisager comme un relais obligatoire.
    Comme le précisait Arkham46, il faut s'assurer que les propriétés [Evénement] de l'objet sont toutes renseignées avec [Procédure événementielle].

    QUESTION:
    Ce comportement est-il identique sous les versions d'Access XP et 2003 ?

    D'avance merci pour vos réponses.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut Re: Programmation événementielle WithEvents: SUB RELAIS !
    Citation Envoyé par =JBO=
    QUESTION:
    Ce comportement est-il identique sous les versions d'Access XP et 2003 ?
    J'ai Access 2003 sous Windows XP et ça marche effectivement comme ça. Sans xCmd.onClick = "[Procédure événementielle]" ajouté, le relais vers xCmd_onClick() définit dans le module de classe n'avait pas lieu.

    Caroline
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Re: Programmation événementielle WithEvents: SUB RELAIS !
    Citation Envoyé par Caroline1
    J'ai Access 2003 sous Windows XP et ça marche effectivement comme ça. Sans xCmd.onClick = "[Procédure événementielle]" ajouté, le relais vers xCmd_onClick() définit dans le module de classe n'avait pas lieu.
    Caroline, merci pour cette information qui me sera précieuse.

    C'est vraiment dommage que Microsoft n'ait pas amélioré cet aspect de l'intégration de VBA et des applications hôtes, comme Access .

    A bientôt,
    =JBO=

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Super.
    ça fait plusieurs semaines que je cherchais le pourquoi du non fonctionnement
    C'est bon avec [Procédure événementielle] . Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vba module de classe
    Par Yann19 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2013, 17h34
  2. [XL-2003] Module de classe avec évènement Exit
    Par MarcelG dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 03/04/2013, 15h38
  3. VBA Module de classe
    Par koolWak dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2007, 22h50
  4. [VBA]Import modules de classe dans Access 2003
    Par pht33 dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/04/2007, 15h45
  5. Réponses: 8
    Dernier message: 22/02/2006, 15h09

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