XL 2016 Passage d'un sous-objet par référence impossible

Lu76Fer

XLDnaute Occasionnel
Bonjour à toutes et tous,
Je vais vous expliquez mon cas au travers d'un cas concret ce sera plus simple :
Soit on ajoute une classe dans le module de classe : C_Chaine
VB:
Public NextVal As C_Chaine
Public Val As Integer
Objet : tmpCh
Sous-Objet : ch.NextVal
Les objets sont passés par référence par défaut mais je vais tout de même forcé le passage par référence ce qui n'aura aucune utilité en faite !
Voici mon code et le code à regarder : addChaine ch.NextVal
VB:
Sub SubObjByRef1()
Dim ch As New C_Chaine
    ch.Val = 1
    addChaine ch.NextVal
    If ch.NextVal Is Nothing Then
        Debug.Print "Valeur suivante introuvable !!"
    Else
        Debug.Print ch.NextVal.Val
    End If
End Sub

Sub addChaine(ByRef ch As C_Chaine)
    Set ch = New C_Chaine
    ch.Val = 2
End Sub
On voit que cela ne fonctionne pas alors qu'en corrigeant comme ceci, cela fonctionne :
Code à regarder : addChaine tmpCh: Set ch.NextVal = tmpCh
VB:
Sub SubObjByRef2()
Dim ch As New C_Chaine, tmpCh As C_Chaine
    ch.Val = 1
    addChaine tmpCh: Set ch.NextVal = tmpCh
    If ch.NextVal Is Nothing Then
        Debug.Print "Valeur suivante introuvable !!"
    Else
        Debug.Print ch.NextVal.Val
    End If
End Sub
Connaissez-vous une autre façon de coder cela plus simplement ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
@Lu76Fer
cherche une discussion avec mon pseudo et et le pseudo @RyuAutodidacte
concernant une classe xml
tu verra j'ai fait une classe que je manipule comme un DOMDOCUMENT(xml)
c'est pour te dire a quel point on peut aller
je te fait un exemple de plusieurs niveau si tu veux vite fait
c'est vrai que les modules classe ca fait peur quand on maitrise pas c'est pour ca que l'on trouve pas d'exemple ou très peu avec explications intelligibles pour ceux qui n'en on pas l'habitude
ça qu'il y a de bien avec les module classe c'est que l'on peut créer l'object et ses property de tout pièce
 

Lu76Fer

XLDnaute Occasionnel
re
imaginons et là ici on va faire simple une arbo de 2
le module classe nommé "C_Chaine"
VB:
Public val
Public Nextval As New c_chaine
Public previousVal As c_chaine

Public Function AddChaine(v)
    Me.Nextval.val = v
    Set Me.Nextval.previousVal = Me
End Function
le module standard

Code:
Dim ch As New c_chaine
Sub test()
ch.val = 1
ch.AddChaine 2
MsgBox ch.Nextval.val
MsgBox ch.Nextval.previousVal.val
End Sub
on remarquera ici les déclarations d'object classe que l'un est un new object l'autre est un object

autrement dit dans le module standard
quand je crée "ch" je crée aussi nextval implicitement
et dans la fonction Addchaine de la classe je renvoie l'object ch dans le previous
ainsi chaque object c_chaine a son nextval et son previousval
on peut donc descendre et remonter l'arborescence

maintenant si l'on veut plusieurs object de même niveau on utilisera une collection ou un array
intra classe bien sur
en C c'est vrai on a pas besoins de tout ça c'est implicit

robert bonjour j'adore !!! "on vous rappellera"🤣🤣
Bonjour Patrick,
Dans mon arbre pour les valeurs égales utiliser une collection est une très bonne idée. Par contre, j'ai voulu bidouiller une liste chaînée et c'est plus simple une collection.
J'ai créer indirectement un tableau comme membre public de mon objet et c'est normalement bloqué par l'interpréteur :
RulesObject.jpg

mais on peut contourner cette erreur sans le savoir; à déconseiller car cela ne permet pas d'affecter simplement des objets dans les éléments du tableau... La collection est préférable et offre toutes les fonctions utiles (faite sur mesure)!
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il est quand même possible de déclarer un tableau dynamique Private dans un module de classe.
Une Property Let peut l'initialiser et une Propery Get ou un Function peut le restituer. J'ai comme ça deux tableaux As Long dans mon module de classe ListeAléat.
 

Lu76Fer

XLDnaute Occasionnel
Bonsoir.
Il est quand même possible de déclarer un tableau dynamique Private dans un module de classe.
Une Property Let peut l'initialiser et une Propery Get ou un Function peut le restituer. J'ai comme ça deux tableaux As Long dans mon module de classe ListeAléat.
Bonjour Dranreb,
Oui en privé pas de problème mais en public aussi si on le déclare dynamiquement avec un variant Array. Mais impossible d'y accéder via un autre objet :
VB:
'CLASSE: MaClasse
Public v As Variant
Public Name As String

Sub Init(obj As MaClasse)
    v = Array(obj) 'Pas besoin de l'instruction Set !
End Sub

'MODULE: Test
Sub TestIllustratif()
Dim ob1 As New MaClasse, ob2 As New MaClasse, ob3 As New MaClasse
    ob1.Name = "Objet 1": ob2.Name = "Objet 2": ob3.Name = "Objet 3"
    ob1.Init ob2
    Debug.Print ob1.v(0).Name
    Set ob1.v(0) = ob3
    Debug.Print ob1.v(0).Name
End Sub
Je spoile le résultat :eek::
Objet 2
Objet 2

La fonction Set ne génère aucune erreur mais ne fait rien !
 

dysorthographie

XLDnaute Accro
Bonjour,
Personnellement je pense que passer par un tableau revient à faire du procédural dans un objet de classe qui lui accepte un autre modèle de penssée que le procédural.

Il est possible de décaler une collection en public. Une collection permet de nommer les instances plutôt que de rechercher l'instance dans un tableau de plus il est possible de chêner les collections.

Coloc("toto").Colec ("titi"). Toto et titi fonctionne comme un aiguillage.

Pour les utilisateurs de windows il y a dictionary qui possède la méthode exists et qui peut extraire un tableau d'instances.

Personnellement je trouve abberan d'utiliser de tableaux dans une classe mais c'est un avis personnel.
 

Dranreb

XLDnaute Barbatruc
La fonction Set ne génère aucune erreur mais ne fait rien !
En tout cas le mot clé Set dans une déclaration d'objet rend en effet inutile une instruction Set parce qu'elle est dès lors assumée à la première allusion à la variable.

Edition: J'avoue que je ne comprends pas très bien pourquoi un Set à un élément d'un tableau contenue dans une propriété Variant ne fonctionne pas. Mais en l'écrivant comme je l'aurais fait ça à l'air de marcher :
VB:
Option Explicit
'CLASSE: MaClasse
Private V(0 To 2) As MaClasse
Public Name As String
Property Set NoeudPère(ByVal RHS As MaClasse)
   Set V(0) = RHS
   End Property
Property Get NoeudPère() As MaClasse
   Set NoeudPère = V(0)
   End Property
VB:
'MODULE: Test
Sub TestIllustratif()
   Dim ob1 As New MaClasse, ob2 As New MaClasse, ob3 As New MaClasse
   ob1.Name = "Objet 1": ob2.Name = "Objet 2": ob3.Name = "Objet 3"
   Set ob1.NoeudPère = ob2
   MsgBox ob1.NoeudPère.Name
   End Sub
 
Dernière édition:

Lu76Fer

XLDnaute Occasionnel
Bonjour,
Personnellement je pense que passer par un tableau revient à faire du procédural dans un objet de classe qui lui accepte un autre modèle de penssée que le procédural.

Il est possible de décaler une collection en public. Une collection permet de nommer les instances plutôt que de rechercher l'instance dans un tableau de plus il est possible de chêner les collections.

Coloc("toto").Colec ("titi"). Toto et titi fonctionne comme un aiguillage.

Pour les utilisateurs de windows il y a dictionary qui possède la méthode exists et qui peut extraire un tableau d'instances.

Personnellement je trouve abberan d'utiliser de tableaux dans une classe mais c'est un avis personnel.
Bonjour dysorthographie,
Tout à fait, cela complique les choses en définitive ... J'ai utilisé une collection dans ma version d'arbre AVL pour régler le cas des doublons qui ne sont pas pris en charge dans l'arbre directement c'était beaucoup plus simple et efficace !
 

patricktoulon

XLDnaute Barbatruc
Bonjour
perso j'ai rien compris de l'intention
on sait plus qui est l'enfant ou le père ou la mère que qui
c'est une classe consanguine ça 🤣

l’accès en public d'un module standard au éléments est rendu possible si les add et modif sont des fonctions pour property public dans la classe
la hiérarchie oui un object collection est en effet la manière la plus simple de faire et toujours en public
pour pouvoir travailler d'un module standard

la classe devient un peu une librairie avec ses méthodes et fonctions et properties
exactement comme ma classe XML customUI ,qui simule la librairie d'un domdocument xml
 

Lu76Fer

XLDnaute Occasionnel
En tout cas le mot clé Set dans une déclaration d'objet rend en effet inutile une instruction Set parce qu'elle est dès lors assumée à la première allusion à la variable.

Edition: J'avoue que je ne comprends pas très bien pourquoi un Set à un élément d'un tableau contenue dans une propriété Variant ne fonctionne pas. Mais en l'écrivant comme je l'aurais fait ça à l'air de marcher :
VB:
Option Explicit
'CLASSE: MaClasse
Private V(0 To 2) As MaClasse
Public Name As String
Property Set NoeudPère(ByVal RHS As MaClasse)
   Set V(0) = RHS
   End Property
Property Get NoeudPère() As MaClasse
   Set NoeudPère = V(0)
   End Property
VB:
'MODULE: Test
Sub TestIllustratif()
   Dim ob1 As New MaClasse, ob2 As New MaClasse, ob3 As New MaClasse
   ob1.Name = "Objet 1": ob2.Name = "Objet 2": ob3.Name = "Objet 3"
   Set ob1.NoeudPère = ob2
   MsgBox ob1.NoeudPère.Name
   End Sub
J'ai bien compris l'utilité des propriétés Get, Let ou Set pas de soucis. Je crois que l'on est toujours sur un cas similaire à celui que je présente dans le sujet.
VB:
'Accès direct
Set ob1.v(0) = ob3
'En passant par property Get
Set ob1.NoeudPère = ob2
Dans mon cas (Accès direct), ob1.v(0) est vu comme une expression et pas une référence à l'objet alors que dans votre cas Get renvoie une référence à l'objet.
C'est pour cela que votre version fonctionne et pas la mienne.
 

Lu76Fer

XLDnaute Occasionnel
Bonjour
perso j'ai rien compris de l'intention
on sait plus qui est l'enfant ou le père ou la mère que qui
c'est une classe consanguine ça 🤣

l’accès en public d'un module standard au éléments est rendu possible si les add et modif sont des fonctions pour property public dans la classe
la hiérarchie oui un object collection est en effet la manière la plus simple de faire et toujours en public
pour pouvoir travailler d'un module standard

la classe devient un peu une librairie avec ses méthodes et fonctions et properties
exactement comme ma classe XML customUI ,qui simule la librairie d'un domdocument xml
Bonjour Patrick,
Oui tout à fait convaincu !! C'est comme cela que j'ai fait sur un Arbre AVL.
Le VBA est un langage pseudo-objet et je pense qu'il présente dans sa gestion des objets des imperfections ou bizarreries. Il est préférable d'être au courant car sinon on peut rester bloqué longtemps sur un bug, sans comprendre d'où cela vient.
C'est aussi la raison pour laquelle j'ai créé ce sujet de discussion ...
 

patricktoulon

XLDnaute Barbatruc
re

la classe
VB:
Public child As New Collection
Public nom As String
Public pere
le module standard
VB:
Dim cls As Classe1

Sub test()
    Set cls = New Classe1
    cls.nom = "robert"

    x = Array("gaston", "paul", "henry")
    For i = 1 To 3
        Set c = New Classe1
        c.nom = x(i - 1)
        Set c.pere = cls
        cls.child.Add c
    Next


    y = Array("kevin", "edouard", "imann")

    For i = 1 To 3
        Set c = New Classe1
        c.nom = y(i - 1)
        Set c.pere = cls.child(i)
        cls.child(i).child.Add c
    Next

    MsgBox "le petit fil de """ & cls.nom & """ se nommant """ & y(2) & """  est le fils de'" & cls.child(3).child(1).pere.nom

'traduction
'cls.child(3).child(1).pere.nom
'patriarche.enfant(3).enfant(1).pere.nom
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 144
Messages
2 116 721
Membres
112 845
dernier inscrit
dadal10