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 :

Appel de module de classe dans un sous-formulaire


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Appel de module de classe dans un sous-formulaire
    Bonjour,

    Voici mon problème :
    Il s'agit d'une application access dans laquelle j'ai un formulaire qui lui-même affiche un sous-formulaire en mode continu.

    On peut simplifier, pour imager, que mon formulaire est un devis et mon sous-formulaire ma liste d'article.

    J'avais écrit tout mon code dans mon formulaire et sous-formulaire. Etant confronté à une duplication de l'ensemble (formulaire et sous-formulaire), je me suis lancé dans les modules de classe pour éviter de tout réécrire à chaque fois (petite précision la duplication se fait à l'intérieur même de la base, par exemple devis type 1, devis type 2...). Je me suis inspiré des tutos du site (un grand merci à leurs auteurs !) et j'ai réussi à faire une classe qui gère les évènements de mes contrôles identiques sur chaque formulaire. Ca, ça fonctionne bien.

    Maintenant je souhaitais créer une classe qui gère mes événements dans mon sous-formulaire et là je coince !!

    Voici comment j'ai procédé :

    La classe (clsEventListeArticle) :
    (fortement inspiré du tuto sur la classe MELA)

    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
    55
    Option Compare Database
    Option Explicit
     
    Private oForm  As Form
    Private WithEvents Detail As Section
    Private WithEvents txtQte As TextBox
     
    Public Property Set Form(objForm As Form)
     
        Dim cTxtBox As TextBox
     
        Set oForm = objForm
     
        'initialisation/paramétrage du formulaire à gérer
        Set Detail = oForm.Section(acDetail)
     
        oForm.Section(acDetail).OnDblClick = "[Event Procedure]"
     
        ' parcours le détail du formulaire pour attribuer les évênements aux contrôles spécifié
        For Each cTxtBox In oForm.Section(acDetail).Controls
     
            If Not cTxtBox.Locked Then
     
                cTxtBox.OnClick = "[Event Procedure]"
                Set txtQte = cTxtBox
     
            End If
     
        Next
     
        Set cTxtBox = Nothing
     
    End Property
     
    Private Property Get Form() As Form
        Set Form = oForm
    End Property
     
     
    Private Sub Detail_DblClick(Cancel As Integer)
        ' test de fonctionnement
        MsgBox "2*clic dans detail"
    End Sub
     
     
    Private Sub txtQte_Click()
        ' test de fonctionnement
        MsgBox "clic dans txtboxQte"
    End Sub
     
    Private Sub Class_Terminate()
        Set oForm = Nothing
        Set Detail = Nothing
        Set txtQte = Nothing
    End Sub
    et code dans le sous-formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Compare Database
    Option Explicit
     
    Dim mEventListeArticle As clsEventListeArticle
     
    Private Sub Form_Open(Cancel As Integer)
     
        Set mEventListeArticle = New clsEventListeArticle
        Set mEventListeArticle.Form = Me
     
    End Sub
    Cela fonctionne quand j'ouvre mon sous-formulaire directement (DoCmd.OpenForm "nom de mon sous-formulaire")

    Mais pas quand mon sous-formulaire est intégré dans mon formulaire....

    J'ai essayé d'instancier ma classe depuis pas mal d'endroit (open de mon formulaire, depuis un module)
    Quand je fais le pas à pas, le programme lit bien ma classe et trouve mes contrôles mais après j'ai pas de retour sur les évènements.

    Une explication/correction/solution(YES !) (/punition...) ????

    Merci

    Frédéric

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Je me suis replongé dans mon problème décrit au dessus.

    Déjà j'ai corrigé une première erreur :
    Je pensais qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim cTxtBox As TextBox
     
    For Each cTxtBox In oForm.Section(acDetail).Controls
    ...
    Next
    J'aillais boucler sur tous les textbox de la section. En fait pas du tout ...

    Corrigé en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim ctrl As Control
     
    For Each ctrl In oForm.Section(acDetail).Controls
        If TypeOf ctrl Is TextBox Then
    ...
        End If
    Next
    Ensuite j'ai isolé le problème en créant une nouvelle base avec un exemple simple et épuré de ce que je cherchais à faire. Cela a fonctionné... Donc ce n'est pas ce code qui est en cause.

    Je suis revenu sur la base qui me pose problème et j'ai créé un bouton "test" sur le formulaire principal qui contient un appel à une procédure (Public) du sous-formulaire. Dans cette procédure j'ai copié le même code que le celui du Form_Open du sous-formulaire. Cela a pour effet de recréer l'instanciation de ma classe. Et ça a marché.

    J'ai donc trouvé une astuce mais ce que je ne comprend pas c'est pourquoi je dois y recourir. Alors que dans mon essai sur un exemple simple fonctionnait sans ça. Est-ce que cela pourrait provenir du fait que la source de mon sous-formulaire est vide au départ et ensuite alimenté depuis l’événement Load de mon formulaire ?

    Merci de votre aide !!

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/08/2014, 14h59
  2. Réponses: 2
    Dernier message: 15/02/2009, 18h06
  3. module de recherche dans un sous formulaire
    Par froutloops62 dans le forum IHM
    Réponses: 21
    Dernier message: 31/07/2007, 01h20
  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: 1
    Dernier message: 27/02/2007, 11h28

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