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

VB 6 et antérieur Discussion :

Une classe dans une classe...


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut Une classe dans une classe...
    Bonjour!

    Je suis programmeure et depuis ce matin je me casse la tête

    J'utilise VB6. J'essaie de faire une classe dans une classe... j'explique.

    Pour un modele, je peux avoir plusieurs conditions. Je me suis donc crée deux classes : une classe pour les modeles (clsModele) et une classe de conditions (clsConditions).

    Dans la classe de condition, je définie mes variables et mes propriétés de get et de let. Jusque là, tout va bien.

    Dans la classe de modèle, je définis également mes variables, et mes propriétés de let et de get. Mais ici je me demande comment je définis ma classe de conditions?

    Maintenant, dans ma fonction principale, je pensais me définir un tableau de type clsModele pour avoir une classe de modele. Et pour chaque modèle je veux etre en mesure d'accéder aux variables de la classe condition. VOici ce que j'ai fait jusqu'à maintenant :


    Ma classe de modele
    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
     
    Option Explicit
     
    Private strVar1 As String     
    Private strVar2 As String     
    Private strVar3 As String     
     
    Private iNumCondition As Integer
    Private ucCondition() As clsCondition
     
    'Propriété de mise à jour de Var1
    Public Property Let Var1(ByVal s_val As String)
        strVar1 = s_val
    End Property
     
    'Propriété de lecture de Var1
    Public Property Get Var1() As String
        Var1= strVar1
    End Property
     
    Public Function AddCondition() As Integer
        iNumCondition = iNumCondition + 1
        ReDim Preserve ucCondition(iNumCondition)
        Set ucCondition(iNumCondition) = New clsCondition
        AddCondition = iNumCondition
    End Function
     
    Private Sub Class_Initialize()
    iNumCondition = 0
    End Sub
     
    Public Property Get Condition(ByVal iPos As Integer) As clsCondition
        Condition = ucCondition(iPos)
    End Property
    et voici comment j'utilise ma classe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim gModele() As clsModele
    ReDim Preserve gModele(1)
    Set gModele(1) = New clsModele
    iPos = gModele(1).AddCondition
    et lorsque je fais cet appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gModele(1).Condition(iPos).Colonne = "quelquechose"
    ca ne fonctionne pas puisque la variable Condition n'existe pas....

    Donc je réitère ma question : comment je fais pour appeller une classe dans une classe pour que je puisse dans mon code accéder aux données de ma sous classe?

    Merci beaucoup
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    pourrais tu mettre un bout de code de ton module clsCondition, en particulier les properties Let/Get de Colonne STP ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Xo -- mais bien sur, voici la classe clsCondition. C'est une classe hyper simple avec des propriété de lecture et de mise à jour de 5 champs.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Option Explicit
     
    Private iOrdre As Integer                   'Ordre d'affichage
    Private iChamp As Integer                   'Colonne - champ
    Private iOperateurComparaison As Integer    'Opérateur de comparaison
    Private iOperateurBitwise As Integer        'Opérateur bitwise
    Private strValeur As String                 'Valeur de la condition
     
    'Propriété de mise à jour de Ordre
    Public Property Let Ordre(ByVal i_val As Integer)
        iOrdre = i_val
    End Property
     
    'Propriété de lecture de Ordre
    Public Property Get Ordre() As Integer
        Ordre = iOrdre
    End Property
     
    'Propriété de mise à jour de Colonne
    Public Property Let Colonne(ByVal i_val As Integer)
        iChamp = i_val
    End Property
     
    'Propriété de lecture de Colonne
    Public Property Get Colonne() As Integer
        Colonne = iChamp
    End Property
     
    'Propriété de mise à jour de OperateurComparaison
    Public Property Let OperateurComparaison(ByVal i_val As Integer)
        iOperateurComparaison = i_val
    End Property
     
    'Propriété de lecture de OperateurComparaison
    Public Property Get OperateurComparaison() As Integer
        OperateurComparaison = iOperateurComparaison
    End Property
     
    'Propriété de mise à jour de OperateurBitwise
    Public Property Let OperateurBitwise(ByVal i_val As Integer)
        iOperateurBitwise = i_val
    End Property
     
    'Propriété de lecture de OperateurBitwise
    Public Property Get OperateurBitwise() As Integer
        OperateurBitwise = iOperateurBitwise
    End Property
     
    'Propriété de mise à jour de Valeur
    Public Property Let Valeur(ByVal s_val As String)
        strValeur = s_val
    End Property
     
    'Propriété de lecture de Valeur
    Public Property Get Valeur() As String
        Valeur = strValeur
    End Property
     
    Private Sub Class_Initialize()
    iOrdre = 0
    iChamp = 0
    iOperateurComparaison = 0
    iOperateurBitwise = 0
    Valeur = vbNullString
    End Sub
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Dans ta classe Modèle, corrige ta Property Get Condition, il faut un Set quand on manipule des objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get Condition(ByVal iPos As Integer) As clsCondition
        Set Condition = ucCondition(iPos)
    End Property
    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gModele(1).Condition(iPos).Colonne = "quelquchose de numérique"
    devrait fonctionner : peux-tu me le confirmer ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Xo - Je programme en VB6, et pour modifier une propriété c'est la fonction LET.

    Je dois donc utiliser cette déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Let Condition(ByVal ipos As Integer)
         Condition = ucCondition(ipos)
    End Property
    Cependant lorsque j'exécute mon code je n'ai toujours pas acces a la classe condition via la variable gModele. Lorsque je regarde le contenu (watch) de la variable gModele je vois effectivement le tableau contenant la classe mais je ne peux y accéder puisqu'elle est private.

    Si j'essaie d'ajouter une propriété de lecture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get Condition() As clsCondition
        Condition = ucCondition
    End Property
    Voici le message d'erreur que je recois sur la fonction LET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Compile Error : 
     
    Definitions of property proicedures for the same property are inconsistent, or property procedure has an optional parameter, a ParmArray, or an invalid Set final parameter.
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Baquardie
    Xo - Je programme en VB6
    Moi aussi

    Citation Envoyé par Baquardie
    et pour modifier une propriété c'est la fonction LET.
    Je pense que tu n'as pas bien compris mon intervention :
    Ta property Condition est une instance de la classe clsCondition. Pour accéder à la valeur de ta propriété, donc dans le Get Condition, tu doit donc affecter à la variable Condition la valeur ucCondition(iPos).
    Cette instruction se fait avec le mot clé Set, c'est la syntaxe VB pour les affectation d'objets. Je persiste donc avec ma correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get Condition(ByVal iPos As Integer) As clsCondition
        Set Condition = ucCondition(iPos)
    End Property
    Pour la suite de ton code, tu as une fonction AddCondition pour créer une condition, OK, donc pas besoin de "Let Condition"

    Avec copie de tes 2 modules, et ma correction, le code suivant fonctionne chez moi (dans une Form):
    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
    Option Explicit
     
    Dim gModele() As clsModele
    Dim iPos As Integer
     
    Private Sub Command1_Click()
        ReDim gModele(0)
     
        Set gModele(0) = New clsModele
     
        iPos = gModele(0).AddCondition
        gModele(0).Condition(iPos).Colonne = 1
        gModele(0).Condition(iPos).Valeur = 3
     
    End Sub
    PS : un indice de tableau commence à 0, c'est pour ça que contrairement à toi, je démarre à 0
    PPS : Le preserve n'est utile que si tu souhaite conserver les données déjà insérées dans ton tableau.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Effectivement j'avais mal compris ton intervention. Mais maintenant c'est clair! Et j'ai effectué la petite modif... et cela fonctionne!!

    Xo je suis très contente d'avoir débloquée je vais pouvoir continuer de développer mon projet...


    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Baquardie
    je vais pouvoir continuer de développer mon projet...
    Bon courage
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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