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 ?
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
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.
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.
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.
J'ai ce genre d'application dans ce classeur.
Et si une Sub qui n'est pas chargée de définir un objet, qu'elle soit méthode ou non, peut toujours le prendre en ByVal.
J'ai ce genre d'application dans ce classeur.
Et si une Sub qui n'est pas chargée de définir un objet, qu'elle soit méthode ou non, peut toujours le prendre en ByVal.
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
Sub SubObjByRef1()
Dim ch As New C_Chaine
ch.Val = 1
Set ch.NextVal = addChaine
If ch.NextVal Is Nothing Then
Debug.Print "Valeur suivante introuvable !!"
Else
Debug.Print ch.NextVal.Val
End If
End Sub
Function addChaine() As C_Chaine
Set addChaine = New C_Chaine
addChaine.Val = 2
End Function
bonjour à tous
et oui c'est ça quand on essaie de convertir un code C en VB
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
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
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