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:

Dranreb

XLDnaute Barbatruc
Bonjour
Un objet doit normalement se transmettre ByVal à une procédure Sub.
Plutôt que de le transmettre ByRef il vaut mieux, si c'est vraiment trop compliqué de faire autrement, que ce soit une Function qui en renvoie un exemplaire à définir ainsi, par un Set à sa valeur retournée.
 

Lu76Fer

XLDnaute Occasionnel
Bonjour
Un objet doit normalement se transmettre ByVal à une procédure Sub.
Plutôt que de le transmettre ByRef il vaut mieux, si c'est vraiment trop compliqué de faire autrement, que ce soit une Function qui en renvoie un exemplaire à définir ainsi, par un Set à sa valeur retournée.
Bonjour Dranreb,
Par défaut c'est byRef (dans le code que je propose on peut enlever byRef)après tout dépend des cas.
Mais pour ch.NextVal pas le choix c'est byVal.
 

Dranreb

XLDnaute Barbatruc
Dites moi plutôt ce que vous voulez pouvoir écrire dans le code d'application utilisant votre type d'objet C_Chaine. Et enlevez moi ce "_" dans le nom. Ce caractère doit être réservé aux noms de procédures de prise en charge d'évènements comme séparateur entre le nom de l'objet et le nom de l"évènement.
Très souvent je les équipe d'une méthode que j'appelle toujours Init pour initialiser leurs propriétés.
 
Dernière édition:

Lu76Fer

XLDnaute Occasionnel
Dites moi plutôt ce que vous voulez pouvoir écrire dans le code d'application utilisant votre type d'objet C_Chaine. Et enlevez moi ce "_" dans le nom. Ce caractère doit être réservé aux noms de procédures de prise en charge d'évènements comme séparateur entre le nom de l'objet et le nom de l"évènement..
J'ignorai la charte concernant le nom de procédure évènementielle, cela dit il s'agit d'un nom de classe personnel.
Je dois faire passer par référence le sous-objet ch.NextVal à une autre procédure et ma solution est celle-ci :
VB:
Dim (...), tmpCh As C_Chaine
    (...)
    Set tmpCh = ch.NextVal: addChaine tmpCh: Set ch.NextVal = tmpCh
Connaissez-vous une autre façon de coder cela plus simplement ?
Je pense que non et que c'est la seule façon ...
Le projet :
Je teste un Arbre de Recherche Équilibré qui était écrit en langage C et que j'ai convertie en VB. Du coup il est indispensable de faire passer mon objet par référence sinon cela brise tous les liens entre chaque noeud et fils gauche et fils droit.
 

dysorthographie

XLDnaute Accro
VB:
Sub SubObjByRef1()
Dim ch As New C_Chaine
    ch.Val = 1
    Set ch.NextVal = addChaine(ch.Val)
    If ch.NextVal Is Nothing Then
        Debug.Print "Valeur suivante introuvable !!"
    Else
        Debug.Print ch.NextVal.Val
    End If
End Sub

Function addChaine(V) As C_Chaine
    Set addChaine = New C_Chaine
    addChaine.Val = V + 1
End Function

un collection serait peut-être judicieuse si tu veux étirer sur plusieurs classe New 10 C_Chaine
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour à tous
et oui c'est ça quand on essaie de convertir un code C en VB :D
en C c'est implicite en vba il faut que les objects et sous object soient déclarés en bon et du forme
on parle aussi de noeud d'arborescence
on peut le faire soit avec un module classe soit avec des variables type
pour faire une arborescence avec une classe on peut utiliser une variable array ou voir une collection
donc en l’occurrence ici
val est une variable num da la classe et nextval est une variable object DANS LA CLASSE!! représentant un object classe lui même
 

patricktoulon

XLDnaute Barbatruc
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"🤣🤣
 
Dernière édition:

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"🤣🤣
Merci car il y a peu de ressource sur le net d'implémentation d'algo de chaîne ou d'algo récursif ... Je vais étudier tout cela ) !
 

Discussions similaires

Statistiques des forums

Discussions
315 088
Messages
2 116 088
Membres
112 656
dernier inscrit
VNVT