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 :

Portées des propriétés-Relations entre objets


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Portées des propriétés-Relations entre objets
    Bonsoir à tous
    J'ai une questions qui concerne la portée des propriétés d'un objet que je n'arrive pas à régler.

    J'ai un Objet1 défini par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Option Explicit
    Public mListDiam As cColInteger
    Private mFerr As New cColObj11
    La collection cColInteger est une liste d'entiers

    Un Objet11 défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Option Explicit
    Private mIndDiam As Integer         ' Indice de Diamètre
    Private mRayon As Integer           ' Rayon
    avec sa collection

    La propriété mIndiam repère l'indice du diamètre dans la collection mListDiam

    Mon pb réside dans le fait que la propriété mRayon dépend de la valeur de
    mListDiam(mIndDiam)

    Lors de l'exécution VB me dit que mListDiam n'est pas défini.
    C'est en fait un (simple) pb de portée mais comment faire pour que la propriété mListDiam soit vue par tous les objets de la collection mFerr créée dans Objet1. C'est une mise en commun d'une propriété l'objet principal à tous les sous-objets.
    Je souhaite faire ceci car Objet11 est une brique pouvant être utilisée dans plusieurs type d'Objet1-Objet2.....
    j'ai essayé avec Friend mais sans résultats. Aussi avec Parent mais je n'ai pas su l'utiliser dans la propriété mRayon car je n'ai pas le nom de l'objet en cours pour lui réclamer le nom de sont parent

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 643
    Points
    16 643
    Par défaut
    Le problème est que tu ne precises pas ou sont fait les 2 declarations distinctes (au vue de 2 Option Explicit)
    Si mListDiam n'est pas declaré dans un module.bas mais dans un Form, VB te dit que mListDiam n'est pas défini, normal, une declaration dans un Form, même en Public, sa portée n'est que dans le Form ou elle est declarée.
    Dans un Module.bas, la porté est pour toutes les Forms composant ton Programme.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    La déclaration de mListDiam est faite dans une classe.
    En effet je souhaite que mon objet Objet1 travaille de manière indépendante d'un quelconque affichage.
    De même que Objet11 ou cInteger qui possède sa collection sous forme de classe.
    C'est en effet un pb de relation entre des objets définis en temps que classes distinctes. Les classes Objet11, cInteger avec leurs collections sont utilisés dans des objets divers. Ce sont vraiment des briques.

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Je n'arrive pas a comprendre tes objets/collections.
    Je suppose que tu as une erreur de conception car tout objet doit être parfaitement independant (Il n'est pas possible qu'une propriété soit partagée entre des classes) c'est un des principes de base de la programmation objet.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Delbeke

    En effet il doit y avoir un bug de conception, car c'est ce que je cherche à créer.
    Je vais tenter d'expliquer ce que je souhaite faire tu pourras peut être m'aiguiller pour modifier le code.

    J'ai une classe qui défini la forme d'un acier nommée cBarre (pour faire du ferraillage de béton armé).
    Une pièce de béton armé est donc constituée d'un grand nombre de d'aciers, c'est la Collection d'aciers. J'ai donc une classe cColBarres qui s'occupe d'ajouter.... les aciers.

    Une des caractéristiques des aciers est son diamètre. Une conséquence de ce diamètre est le rayon ce cintrage.

    Selon les pays et les types de pièces de béton armé (poteaux, poutres, murs....) tous les diamètres d'aciers disponibles ne sont pas les mêmes.

    Donc pour gérer ceci je souhaite que la base des aciers utilisables soit contenue dans l'objet Poteau/Mur... C'est une collection d'entiers.

    Dans chaque objet cBarre de la collection cColBarre (elle même contenue dans Objet Poteau ou Poutre) je ne stocke que l'indice du diamètre de la collection des aciers disponibles pour une pièce de béton armé.
    Pour calculer le rayon de cintrage d'un acier particulier je doit donc connaitre son diamètre qui lui est contenu dans l'objet Poteau/Poutre.

    Une solution rouleau compresseur consisterai à inclure à chaque objet cBarre la liste des aciers disponibles afin de ne pas faire référence à une variable hors de l'objet.

    Merci encore de ta remarque.

  6. #6
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Désolé, ce n'est toujours pas clair.
    Une chose a savoir, un objet peut avoir une propriété de type collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private m_Aciers As Collection
    Public Property Get Aciers() As Collection
      Set Aciers = m_Aciers
    End Property
    Public Property Set Aciers(ByVal vNewValue As Collection)
      Set m_Aciers = vNewValue
    End Property
    Dans ce cas n'est stocké dans l'objet que le pointeur de la collection

    Peut être que çà t'aidera

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    C'est très intéressant.
    Il faut que je fasse des test pour vérifier si ce que j'entrevois correspond bien.
    Très sympa de ta part de réfléchir encore à mon pb.
    Je te tiendrai au courant de l'évolution.
    Merci encore

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Moi ce que je constate, c'est que tu ne respectes toujours pas le principe d'encapsulation que je t'ai déjà expliqué. Ancre toi ça dans la tête: tu ne dois accéder et modifier tes champs qu'à partir de propriétés et de méthodes.
    Pour résumer, tu dois mettre la portée de tes champs comme étant privée (et donc innaccessibles en dehors de ta classe même s'ils sont affichés dans l'explorateurs d'objets si ta classe est à l'intérieur de ton projet), et pour y accéder tu utilises des propriétés publiques ou friend.
    (pour la portée friend je trouve que c'est très mal expliqué dans l'aide intégrée à VB).
    Et aussi je te suggère (mais je ne t'oblige à rien c'est toi qui vois) d'utiliser des noms de variables plus explicites, car en lisant seulement le code il faut pouvoir comprendre à quoi elles servent.


    Sinon j'ai à peu près compris ce que tu comptes faire.

    Pour ton objet11 (si j'ai bien compris il s'agit d'un seul objet correspondant à un acier, et au passage tu bosses dans l'ingéniérie du BTP?), je te suggère de t'y prendre comme ça:

    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
    Option Explicit
    Private mIndDiam As Integer         ' Indice de Diamètre
    Private mRayon As Integer ' Supprime cette ligne
     
    ' Tu accèderas à ton diamètre avec cette propriété publique
    Public Property Get Diametre() As Integer
         Diametre=mIndDiam
    End Property
    ' Là aussi tu dois mettre Public sinon t'auras du mal à compléter ta collection
    ' Friend convient si tu comptes n'autoriser que les autres classes
    ' (et pas les modules standard) à modifier le diamètre
    Public Property Let Diametre(ByVal nouveau_diametre As Integer) ' Au passage tu vois ce que je veux dire _
    quand je parle de noms explicites
         mIndDiam=nouveau_diametre
    End Propert
     
    ' C'est là que se trouve la subtilité: tu utilises 2 propriétés alors que tu n'as
    ' qu'un seul champ, celle-ci est en lecture seule (pas de propriété let)
    Public Property Get RayonCintrage() As Integer
         Dim resultat_formule as variant
         ' Tu fais ici tes calculs pour déterminer ton rayon
         RayonCintrage=resultat_formule
    End Property

    Voilà, je crois qu'il s'agit de la solution à ton problème: tu as bien ton rayon qui dépend de ton diamètre, et au passage j'espère que maintenant tu comprends pourquoi on accède aux champs à partir de propriétés.

    Et en bonus, si tu veux pouvoir savoir à quelle collection appartient ton objet, tu devras utiliser une propriété de parenté (je l'appelle Parent) qui renvoie une référence vers l'objet parent. Perso pour ça j'utilise un "Friend Property Let Parent" dans mon objet, et dans l'objet parent je mets un "Set objet_fils.Parent=Me".
    Mais avant de maîtriser ça, je te conseille vivement de déjà t'habituer un peu plus au système champs/propriétés/méthodes des modèles objets de VB en travaillant sur des cas très simples comme la simple lecture/écriture de la première propriété que je t'ai donné, puis sur des cas légèrement plus hardus comme la deuxième.

    Un excellent exercice pour bien maîtriser tout ça, ce serait de créer ta collection toi-même sans passer par un objet de type collection.


    EDIT: j'ai oublié de te dire: je te laisse réfléchir à comment programmer ta collection, mais si tu cales je veux bien t'aider y a pas de souci. En effet, là encore il manque des propriétés, et puis si tu veux des méthodes en plus bah c'est le moment de les programmer.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Decondelite
    Merci de te pencher su mon pb
    Je travail bien dans l'ingénierie du BTP
    Question de collection : Les variables cColInteger, cCol... sont chez moi déjà des collections personnelles d'objets personnels

    Exemple sur cColInteger. Le but est d'avoir une liste de valeurs entières triée en ordre croissant et d'avoir accès à une chaine de caractères décrivant de manière succincte les écartements successifs
    Donc pour l'objet personnel Integer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Option Explicit
    Private mIntValue As Integer ' Valeur Entière
    Public Property Get IntValue() As Integer
      ' Propriété en lecture
      IntValue = mIntValue
    End Property
    Public Property Let IntValue(ByVal intNewValue As Integer)
      ' Propriété en écriture
      mIntValue = intNewValue
    End Property
    Et pour la collection
    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
    66
    67
    68
    69
    70
    71
    72
     
    Option Explicit
    Private mColIntegers As New Collection
     
    Property Get TextRépartition() As String
     ' Propriété en lecture
     TextRépartition = "RESULTAT DE LA COMPILATION DES ECARTEMENTS"
     'Routine créant la liste des répartitions successives
     Dim I As Integer, EspP As Single, Esp As Single, N1 As Integer
     With mColIntegers
      EspP = .Item(2) - .Item(1): N1 = 0
      TextRépartition = ""
      For I = 2 To .Count
       Esp = .Item(I) - .Item(I - 1)
       If Esp = EspP Then
         N1 = N1 + 1
       Else
         TextRépartition = TextRépartition & Format(N1, "0") & "x" & Format("0", EspP) & ";"
         EspP = Esp: N1 = 1
       End If
      Next I
      'on ajoute le dernier espacement
      TextRépartition = TextRépartition & Format(N1, "0") & "x" & Format("0", EspP)
     End With
     Dim A As String
    End Property
     
    Public Function Add(NewInteger As Integer)
      Dim I As Integer
      I = 1
      Do While I <= mColIntegers.Count
        If NewInteger = mColIntegers.Item(I) Then Exit Function 'Valeur déjà existante
        If NewInteger < mColIntegers.Item(I) Then
          mColIntegers.Add NewInteger, , I 'ajoute la valeur avant le item(i)
          Exit Function
        End If
        I = I + 1
      Loop
      mColIntegers.Add NewInteger 'ajoute la valeur à la fin
    End Function
    Public Function Item(Id As Integer) As Integer
     Item = mColIntegers.Item(Id)
    End Function
    Public Function Count() As Integer
     Count = mColIntegers.Count
    End Function
    Public Function Remove() As Integer
     mColIntegers.Remove (Remove)
    End Function
    Public Function Clear()
     Dim I As Integer
     For I = 1 To mColIntegers.Count
      mColIntegers.Remove (1)
     Next I
    End Function
    Private Sub Class_Initialize()
      Set mColIntegers = New Collection
    End Sub
    Private Sub Class_Terminate()
      Set mColIntegers = Nothing
    End Sub
    ' NewEnum doit renvoyer l'interface IUnknown de l'énumérateur d'une collection.
    Public Function NewEnum() As IUnknown
      'La procédure Enum permet de faire du for each _ Next
      'Les crochets qui entourent la méthode _NewEnum de l'objet Collection sont nécessaires
      'en raison du trait de soulignement par lequel commence le nom de la méthode.
      'Ce trait de soulignement est une convention indiquant que la méthode est masquée dans
      'la bibliothèque de types. Vous ne pouvez pas nommer votre méthode _NewEnum, mais vous
      ' pouvez la masquer dans la bibliothèque de types et lui affecter l'ID de la procédure
      ' nécessaire pour For Each … Next.
       Set NewEnum = mColIntegers.[_NewEnum]
    End Function
    Si tu as des remarques, je suis preneur car si mon expérience de programmeur vient du très loin (QB45) puis passage au VB6, je souhaite utiliser les objets qui sont d'une grand puissance.

    Mon but était vraiment d'avoir des objets bien encapsulé mais je n'avais pas trouvé d'autre moyen que de mettre une propriété en public afin que tous les autres sous-objets de l'objet global puissent y avoir accès. J'essaye de montrer l'arborescence à laquelle je pensais.

    Obj1

    - Sous Obj11
    - Sous Obj12

    -Sous-Sous Obj121
    -Sous-Sous Obj122
    _ Sous Obj13

    -Sous-Sous Obj121
    -Sous-Sous Obj122

    et ce que je souhaite c'est que une des propriétés en lecture seule de Sous-Sous Obj122 soit fonction d'une valeur se trouvant dans Sous Obj11
    donc d'une variable se trouvant 2 niveaux au dessus.
    J'ai bien essayé avec friend mais j'avoue ne rien avoir compris.
    J'ai aussi essayé de remonter avec Parent mais quand je suis dans un objet personnel je n'accède pas à l'objet dont il est issu. Les lignes
    "Friend Property Let Parent" <= Que faut il mettre dans cette procédure
    Set objet_fils.Parent=Me <= j'aurai plutôt mis Set objet_filsDe.Parent=Me
    m'intéresse sans que je comprenne comment elles fonctionnent
    Merci encore

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Alors là tu as 2 cas qui se présentent:
    -soit tu travailles avec des propriétés/méthodes de ton objet SousObj122 (ce que tu comptes faire), et là il va bien falloir que tu te crées un système de parenté
    -soit tu travailles avec des propriétés/méthodes de ton objet SousObj11 et là c'est au niveau des propriétés/méthodes qu'il y aura du boulot

    Pour tout te dire, les deux méthodes ont des niveaux de difficulté équivalents. Ce qui est sûr, c'est que c'est un cran au dessus de ce que je t'ai donné plus haut.

    Dans le premier cas, tu implantes un système de parenté. C'est pas évident à faire la première fois, mais une fois que tu l'as fait 2 ou 3 fois tu comprends bien la base du système et t'es capable de le recéer sans problème. La contrainte pour maîtriser le système de parenté, c'est qu'il faut bien comprendre comment fonctionne VB en termes de transferts de données par valeurs ou par référence, et bien comprendre ce que signifie exactement le mot clé "Me".

    Dans le deuxième cas, tu n'implantes aucun système de parenté. Ici, tu vas fournir un ou plusieurs paramètres de plus à tes propriétés/méthodes (membres de l'objet SousObj11 je te rappelle) qui te permettront de référencer un sous objet de ton objet obj11 et donc tu travailleras dessus en utilisant tranquillement ses propriétés et méthodes. La contrainte pour coder de cette façon, c'est qu'il faut que tu maîtrises bien la relation entre paramètres et champs de tes classes, et que tu comprennes également bien qu'est-ce que c'est qu'une classe et qu'est-ce que c'est qu'un objet déclaré comme étant du type de ta classe (on appelle ça une instance de la classe).


    Au vu des codes que tu as été capable de sortir, je préfère être honnête: ni l'une ni l'autre des 2 solutions ne sera simple à implémenter et il va y avoir du boulot. Hésite pas à bidouiller et à lire les rubriques d'aide de VB, et utilise au mieux tes outils de débogage.

    Le choix entre les 2 solutions dépendra essentiellement de la sémantique de ton code, autrement dit de la logique d'utilisation des objets que tu veux lui procurer. Et là y a pas de mystère: je ne peux pas t'aider à faire ton choix si je ne sais pas exactement ce que tu veux faire avec ton modèle objet.

    Quoi qu'il en soit, quelle que soit la solution qu'il conviendra d'envisager, je pourrai t'aider à la mettre en place, et ça ne sera pas de trop car ça t'évitera beaucoup d'heures de programmation et d'apprentissage, et moi ça me fera de l'entrainement.

    Et encore une fois fais un effort pour donner de bons noms de variables. Non seulement ça aide les autres à comprendre, mais ça t'aidera toi à mieux t'y retrouver dans ton code, car c'est vite fait d'oublier à quoi sert telle ou telle variable. Ton deuxième bout de code pour ta propriété en lecture seule je n'en ai compris que le principe général.

    Sinon mets plutôt "Sub" que "Function" quand ça ne renvoie pas de valeur. C'est surtout une question de sémantique, mais bien qu'au niveau du résultat ça ne fait aucune différence, une procédure et une fonction ce n'est pas la même chose. Et en plus une function où tu renvoies rien pendra plus de mémoire vive qu'une Sub, pire encore si tu ne lui associes pas un type comme tu l'as fait ça te prendra une valeur de type Variant en plus.

    J'ai un petit commentaire en ce qui concerne ton "class_terminate": ne te contente pas de détruire la collection, mais détruis également tout son contenu (avant de détruire la collection sinon t'auras des problèmes de références ) car sinon tout le contenu de ta collection subsistera en mémoire vive, et pis encore tu ne pourras plus y accéder. Quand un objet est détruit, vérifie toujours si les sous-objets se détruisent également (si tu veux les détruire en même temps).

    Dernier truc: je comprends pas ta dernière procédure. Masquer tes méthodes ne te servira à rien, ou alors j'ai encore moins bien saisi que je ne le pense. Si tu veux pas qu'on voie tes champs, propriétés et méthodes dans l'explorateur d'objets, déclare-les comme étant private et mets-les dans un autre projet que tu inclueras comme référence dans ton projet actuel. Si tu fais ça tu devras régler tes classes en "2 - PublicNotCreatable" et tu devras ajouter un module standard au projet contenant les classes pour arriver à créer une nouvelle instance (puisque c'est "NotCreatable").

    PS: et la POO c'est un bon choix car perso je me verrais pas résoudre un problème complexe avec juste des tableaux et des variables simples, ou même des types structurés.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Decondelite
    Merci de cette longue réponse qui dénote un réel intérêt.

    * Pour ce qui est de la résolution de problèmes complexe une programmation POO est en effet beaucoup plus facile, donc pas de regret.
    * La dernière procédure "Masquée" :Je pense que tu veux parler de "NewEnum" Elle est issue directement de la documentation VB et non retouchée.
    *Pour le Class_Termintate : OK pris en compte. J'avais bien lu quelque chose à ce sujet mais pas pris le temps de comprendre.
    *Pour le choix Fonction ou sub : Très bien facile à faire une fois que l'on a vu la différence en terme de mémoire,
    * Noms plus explicites : J'ai mis le code tel que sans prendre le temps de renommer les variables. Ceci, malheureusement ne se fera que petit à petit,
    *Pour le choix de type d'organisation. Il me semble que ce qui collerai le plus à mon projet c'est celui d'organiser une parenté.
    Par contre, entre temps j'ai décidé d'abandonner la méthode d'avoir recours à "une variable située 2 niveaux au dessus".
    Dans la classe d'objet Acier, J'ai remplacé :
    - la gestion des diamètres disponibles par indices d'une table situé en haut
    par
    - une gestion qui stocke directement le diamètre de l'acier en mm dans chaque objet Acier.

    Cette disposition, en effet, était beaucoup trop complexe vis à vis d'un hypothétique gain de souplesse.
    L'explication réside dans le fait que le changement de la gamme disponible ne peut pas se faire en cours de projet et dans tous les cas les calculs sont à reprendre entièrement. Donc je conserve une table d'aciers disponibles au moment de la créations des aciers mais ensuite cette table ne sera plus modifiée. Si par hasard, elle le devait, alors les calculs seront à reprendre, ce quoi, si le prgm est bien fait, ne devrait pas prendre beaucoup de temps.

    Je suis tout de même preneur pour voir quelles sont les dispositions à prendre pour utiliser les liens de parenté entre les objets.

    Merci encore.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Pour tes aciers, c'est toi qui vois comment tu t'organises.
    Si tu as plusieurs diamètres différents pour un même type d'acier, je te recommande d'avoir recours à 2 objets distincts pour économiser la mémoire de l'ordinateur.
    Si en revanche tu n'as qu'un seul diamètre par acier, alors là effectivement utiliser 2 objets ce serait appliquer le principe "pourquoi faire simple quand on peut faire compliqué".

    En ce qui concerne la parenté, le truc consiste à avoir une méthode d'ajout dans l'objet parent, qui non seulement ajoute un élément à un tableau, mais en plus déclare l'attribut Parent de l'objet créé comme étant "Me".
    D'où le "Set nouvel_objet.Parent=Me", c'est une ligne de code qui ressemble à ça lorsque tu ajoutes un élément.
    Ceci dit, je sais pas si tu vas pouvoir implanter ça, car je ne sais pas si tu utilises l'objet collection fourni avec VB.
    Perso je ne l'utilise pas, et quand j'ajoute un élément ça ressemble à ça:

    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
    ' Méthode ajoutant une phase et renvoyant le numero de la nouvelle phase
    Public Function Ajouter(Optional ByRef phase_donnee As Phase) As Integer
        Dim Numero As Integer, numero_dispo As Boolean, numero_selectionne As Integer
        Dim nouvelle_phase As Phase
        ' Création d'une nouvelle phase si pas de phase renseignée
        ' Copie de la phase renseignée sinon
        If phase_donnee Is Nothing Then
            Set nouvelle_phase = New Phase
            ' Attribution d'un numero disponible à la nouvelle phase
            numero_phase = 10
            On Error Resume Next
            Do
                numero_dispo = True
                numero_selectionne = Me.Entite(numero_phase)
                If Err.Number <> 91 Then
                    numero_phase = numero_phase + 10
                    numero_dispo = False
                End If
                Err.Clear
            Loop While Not numero_dispo
            On Error GoTo 0
            nouvelle_phase.Numero = numero_phase
        Else
            Set nouvelle_phase = phase_donnee.Copie
        End If
        Ajouter = Nombre + 1
        ' Agrandissement d'une case du tableau de phases
        ReDim Preserve phase_phases(Ajouter)
        ' Insertion de la nouvelle phase
        Set phase_phases(Ajouter) = nouvelle_phase
        ' Déclaration du parent: c'est ici que tout se joue
        Set phase_phases(Ajouter).Parent = Me
        ' Activation automatique de la phase ajoutée
        phase_phases(Ajouter).Activer
        ' Renvoi du numéro de phase
        Ajouter = phase_phases(Ajouter).Numero
    End Function
    L'attribut Parent de mon objet Phase:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' Déclaration d'une propriété Parent
    ' Public pour y avoir accès partout
    Public Property Get Parent() As Phases
        Set Parent = parent_phase
    End Property
    ' Friend pour un accès dans toutes les classes, mais pas les modules standard
    Friend Property Set Parent(ByRef nouveau_parent As Phases)
        On Error Resume Next
        Set parent_phase = nouveau_parent
    End Property
    Au passage, tu remarqueras que le nom de mes champs se termine toujours par "_nomdelaclasse". C'est une convention personnelle que je me suis imposé, afin de bien m'y retrouver et faire la différence avec les simples variables.

    Tu comprendras peut-être pas le premier bout de code, mais en gros ce que j'y ai fait à la fin c'est une sorte d'allocation dynamique que j'utilise sur un champ déclaré comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private phase_phases() As Phase
    Et quand je te parlais de la destruction des sous-objets, voici ce que ça donne avec la classe mère:
    (je précise que EstVide est une propriété booléenne en lecture seule qui me dit si le tableau phase_phases() est vide ou non)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Destruction de toutes les phases
    Private Sub Class_Terminate()
        If Not Me.EstVide Then
            For Each Phase In phase_phases
                Set Phase = Nothing
            Next
        End If
    End Sub

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/09/2007, 10h53
  2. [VBA] récupérer tout les noms des propriétés d'un objet
    Par ooyeah dans le forum Général VBA
    Réponses: 6
    Dernier message: 05/03/2007, 16h17
  3. Relation entre objets rollback et buffer cach
    Par Mehdilis dans le forum Oracle
    Réponses: 1
    Dernier message: 04/09/2006, 08h33
  4. [iBATIS] Relations entre objets
    Par Tourix dans le forum Persistance des données
    Réponses: 8
    Dernier message: 25/08/2006, 11h17
  5. [VB6] Modification des propriétés d'un objet de form dans un module
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 09/06/2006, 09h46

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