Une sombre histoire de collection de classes [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 08-03-2011 à 13:38:33
Hello,
ce que tu fais la, c'est définir dans chaque item de ta collection le même objet (la collection defaultclass). il y a une différence entre les variables et les objets.
pour faire court, les informations de l'objet sont stocké dans la mémoire et les "variables" que tu utilises, c'est juste un pointeur.
Un pointeur, ca te dit ou aller chercher l'objet dans la mémoire. en VB tu n'as pa vraiment a te soucier de comment ca marche, mais ca aide pour comprendre.
Ce que tu fais dans ta boucle, c'est définir une nouvelle instance de defaultclass, jusque la, c'est OK. Par contre juste après tu reattribue tmpClass comme pointeur sur l'objet defaultclass, tu modifie sa valeur et tu rajoute le pointeur a la collection.
En gros, tous tes items de ta collection renvoie sur le même objet, pareil pour l'ajout de la valeur.
pour avoir 100 objets différents, il faut instancier 100, c'est d'ailleurs ce que tu fais dans ta boucle a la 1ère ligne :
Set tmpClass = New defaultclass
il te suffit de supprimer cette ligne :
Set tmpClass = defaultclass
et ensuite de définir la valeur de ton objet tmpClass, si tu as besoin de récupérer la valeur de defaultclass, il faudra rajouter une fonction get dans ta classe pour récuper la valeur :
Code :
|
A toi de jouer maintenant.
J'espère que j'ai été assez clair, je ne suis malheureusement pas très doué pour les explications. Je pense qu'il y a un moyen plus simple de t'expliquer cela et j'espère ne pas t'avoir embrouillé avec ces pointeurs qui est plus une notion de C mais je voyais pas comment t'expliquer autrement.
Marsh Posté le 08-03-2011 à 14:13:21
Merci pour l'explication.
Je suis familié avec les pointeurs et je sentais pointer le truc vers les pointeurs mais je n'avais aucune idée de comment m'en débarasser. Je vais regarder du côté de tes propositions et voir ce que cela donne.
Marsh Posté le 08-03-2011 à 13:01:19
Bonjour tout le monde,
J'ai un petite soucis avec la creation d'une collection de classe et plus precisement, en manipulant. Imaginons que je creer la classe myclass avec comme module de classe et que j'initialise sa valeur + fonction pour ajouter une valuer a cette derniere:
Ensuite, j'ai mon joli programme main :
Et ensuite ma belle fonction feedmycoll (dans le meme module) :
Et la, c'est le drame .... La collection va etre remplie avec 100 objets de class myclass ayant la meme value qui sera 220.
Je ne comprends pas pourquoi cela fait cela et j'aimerais pouvoir trouver un moyen de cheater la dessus.
Mon exemple est totalement pipo mais le cadre dans mon probleme est integre a un pogramme largement plus complexe. Cependant le probleme est la :
le fait de faire un Set tmpClass = defaultclass puis un Call tmpClass.Add(i) va aussi modifier la valeur de l'objet defaultclass . De meme, si au lieu de faire un Set tmpClass = defaultclass je fais un tmpClass.value = defaultclass.value, meme probleme.
Le seul moyen moche que j'ai trouve, c'est de creer une variable, par exemple defaultvalueclass, de dire au debut defaultvalueclass= defaultclass.value et ensuite a chaque boucle d'ecrire tmpClass.value = defaultvalueclass.
Il n'y a pas d'autres moyens ?
Message édité par Profil supprimé le 08-03-2011 à 13:05:03