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 :

[A-02] Instance d'une classe d'une base externe


Sujet :

VBA Access

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut [A-02] Instance d'une classe d'une base externe
    Bonsoir,

    J'en suis à déplacer des modules de classes dans une base externe.

    Cela fonctionne très bien, merci =JBO=.

    Je cherche à remplacer l'instance au niveau d'une procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim gobjDate As clsDates
    Set gobjDate = getDates()
    par une déclaration au niveau de l'application, ce qui serait l'équivalent de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDate As New clsDates
    si ma classe était dans l'application elle même...

    Est-ce possible ?

    Domi2

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonsoir,

    J'ai encore fait un certain nombre de recherches (et des essais ) mais sans succés.

    Dans la pourtant très riche littérature du site, je n'ai rien trouvé qui ressemble de près ou de loin à ma demande.

    Dans mes réflexions, j'en suis à me demander s'il ne faudrait pas que je "surclasse" ma classe externe dans mon application (je ne sais pas si c'est le terme adéquat), mais autant dire que je ne vois pas du tout comment il faudrait procéder...

    Si quelqu'un avait un début de piste, un lien vers une discussion similaire...

    Domi2

  3. #3
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Domi2 ,

    je reprends ce que dit notre ami =JBO=:
    Citation Envoyé par =JBO=
    avec une grosse limitation: seul le code contenu dans la base A est autorisé à instancier la classe
    donc tu ne peux pas faire:
    Citation Envoyé par Domi2
    Public gobjDate As New clsDates
    d'après ce qu'il dit tu instancies la classe à partir d'un module de normal que tu peux lui appeler de ta base.

    et si tu regardes bien son code il n'instancie pas une procédure mais une classe.
    ce que visiblement tu recherches à faire.

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour vodiem,

    Pas sûr d'avoir tout compris...

    Actuellement, j'ai dans mon application un module de classe clsDates.

    Au lancement de mon application, j'ai ceci dans un module standard :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDate As New clsDates
    Mon objet gobjDate est donc disponible dans toute mon application sans que j'aie besoin de le recréer et de le détruire chaque fois que je veux l'utiliser dans une procédure ou fonction.

    Si je déplace mon module de classe dans une base externe, cela fonction très bien avec le code de =JBO= :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim gobjDate As clsDates
    Set gobjDate = getDates()
    Mais je dois déclarer mon objet chaque fois que je veux l'utiliser (dans chaque procédure ou fonction), puis le détruire.

    Je trouve la déclaration au niveau de l'application moins "contraignante".

    Domi2

  5. #5
    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 "Surclasse" ??? Agréger, encapsuler
    Bonjour Domi2 et vodiem,

    Citation Envoyé par Domi2 Voir le message
    Actuellement, j'ai dans mon application un module de classe clsDates.

    Au lancement de mon application, j'ai ceci dans un module standard :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDate As New clsDates
    Mon objet gobjDate est donc disponible dans toute mon application sans que j'aie besoin de le recréer et de le détruire chaque fois que je veux l'utiliser dans une procédure ou fonction.

    Si je déplace mon module de classe dans une base externe, cela fonction très bien avec le code de =JBO= :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim gobjDate As clsDates
    Set gobjDate = getDates()
    Mais je dois déclarer mon objet chaque fois que je veux l'utiliser (dans chaque procédure ou fonction), puis le détruire.

    Je trouve la déclaration au niveau de l'application moins "contraignante".
    Eh bien voilà, tu es confronté à ces limitations que nous impose le VBA quand on veut utiliser une classe définie en VBA:
    (a) il est impossible d'instancier directement dans un projet une classe définie dans une bibliothèque externe (opérateur New inutilisable).
    Et sa conséquence pénible:
    (b) on ne peut déclarer ET instancier un objet dans la partie déclaration d'un module de code, que si la classe de l'objet est directement définie dans le projet.

    C'est contraignant, mais tu peux voir le bon côté des choses: l'utilisation de nombreuses variables globales n'est pas conseillée.

    Citation Envoyé par Domi2 Voir le message
    Dans mes réflexions, j'en suis à me demander s'il ne faudrait pas que je "surclasse" ma classe externe dans mon application (je ne sais pas si c'est le terme adéquat), mais autant dire que je ne vois pas du tout comment il faudrait procéder...

    Si quelqu'un avait un début de piste, un lien vers une discussion similaire...
    En effet, quand on arrive à la situation où tu es (plusieurs bibliothèques de classes, un projet qui utilise des classes externes) il devient quasi-naturel de développer une classe interne au projet, que j'appellerai "classe application", qui agrège les objets de diverses provenances, nécessaires au fonctionnement de l'application.

    On peut avoir un "unique objet global" instance de la "classe application".
    Un bon point est qu'on peut initialiser les objets agrégés, dans le constructeur de la "classe application", ce qui donne un meilleur contrôle pour une création cohérente, tout en conservant un automatisme pour la création et l'instanciation (cf. la procédure Class_Initialize).

    Les objets membres de la "classe application" peuvent être visibles ou cachés.
    Dans la terminologie objet, on parle d'encapsulation quand un objet utilisé par la "classe application" n'est pas accessible de l'extérieur de cette classe.
    En conception orientée objet, on conseille souvent de procéder par encapsulation et de programmer des propriétés pour donner accès aux objets encapsulés... encore un peu plus de code me diras-tu...

    Mais les conseilleurs ne sont pas les développeurs !
    Fais donc au mieux de ton intérêt en envisageant une utilisation de tes classes et applications à moyen terme.
    _

  6. #6
    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 "surclasse" ??? rester dans un module de code
    Re-salut Domi2,

    J'ai un encore peu réfléchi à ton besoin.
    Tu es peut-être dans une situation où tu veux rester au niveau d'un module de code pour créer un objet instance d'une "classes externe".

    Donc pour obtenir quelques chose d'équivalent à la déclaration ci-dessous...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDate As New clsDates
    Tu peux envisager de définir une propriété dans le module de code où l'objet est défini, mais ça fait encore du code.

    En revanche, pas besoin de modifier le code qui référence gobjDate (un très bon point, non !?).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private p_objDate As clsDates
     
    Public Property Get gobjDate() As clsDates
        If p_objDate Is Nothing then Set p_objDate = getDates()
        Set gobjDate = p_objDate
    End Property
    En temps d'exécution, l'accès à l'objet n'est pas plus lent que l'accès à un objet déclaré Dim avec opérateur New (le fonctionnement est identique).

    Voilà, maintenant à toi de choisir.
    _

  7. #7
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour =JBO=,

    Et merci...

    Il va falloir que je tente de comprendre tout cela et faire des essais...

    Je vais m'y mettre dès ce soir... Et je reviendrais probablement...

    Domi2

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonsoir,

    Bien, j'ai au moins un terme plus approprié que "surclasser"... Je vais me mettre à rechercher "encapsuler" et dérivés.

    Dautre part sur le site, il y'a des tutos intéressant, y compris pour Excel (mais ça devrait être assez similaire) sur les modules de classes... A relire d'urgence.

    Ceci dit, à te lire et à l'écoute de quelques conseils avisés de vodiem, j'ai réussi à obtenir ce que je voulais...

    J'ai un module standard du nom de mon application et une fonction dans le même module que j'exécute au lancement de l'application.

    Dans la section déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDates As clsDates
    dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set gobjDates = getDates()
    Mon erreur initiale était

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gobjDates As New clsDates
    Ca fonctionne parfaitement, mon objet est disponible dans toute mon application...

    Il y'a peut-être mieux à faire mais je suis déjà ravi du résultat

    Encore un grand merci...

    Domi2

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

Discussions similaires

  1. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  2. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  3. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36
  4. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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