Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
2106 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] Une sombre histoire de collection de classes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] Une sombre histoire de collection de classes

n°2061821
Profil sup​primé
Posté le 08-03-2011 à 13:01:19  answer
 

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:

Code :
  1. Private value as integer
  2. Public Sub Add(ByRef addvalue as integer)
  3.      value = value + addvalue
  4. End Sub
  5. Private Sub Class_Initialize()
  6.      value = 100
  7. End Sub

Ensuite, j'ai mon joli programme main :

Code :
  1. Public Sub main()
  2.      Dim defaultclass as myclass
  3.      Dim coll as Collection
  4.      ' Initialization
  5.      Set class = New myclass   
  6.      Set coll = New Collection
  7.      ' Modify data
  8.      Call defaultclass.Add(20) ' Histoire d'avoir une valeur differente de la valeur d'init
  9.      ' Feed the collection
  10.      coll = feedmycoll(defaultclass)
  11. End Sub

Et ensuite ma belle fonction feedmycoll (dans le meme module) :

Code :
  1. Private Function feedmycoll(ByRef defaultclass as myclass) as Collection
  2.      Dim tmpClass as myclass
  3.      Dim i as integer
  4.      ' Initialization
  5.      Set tmpClass = New myclass
  6.      Set feedmycoll = New Collection
  7.      ' Loop
  8.       For i = 1 to 100
  9.           ' Reset
  10.           Set tmpClass = New defaultclass
  11.           Set tmpClass = defaultclass
  12.           ' Add
  13.           Call tmpClass.Add(i)
  14.           feedmycoll.Add tmpClass
  15.      Next i
  16. End Function
 

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 ? :sweat:


Message édité par Profil supprimé le 08-03-2011 à 13:05:03
mood
Publicité
Posté le 08-03-2011 à 13:01:19  profilanswer
 

n°2061827
Arwon
Posté le 08-03-2011 à 13:38:33  profilanswer
 

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 :
  1. Public Function GetValue() As Integer
  2. getValue = value
  3. End Function


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.


Message édité par Arwon le 08-03-2011 à 13:39:03
n°2061835
Profil sup​primé
Posté le 08-03-2011 à 14:13:21  answer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] Une sombre histoire de collection de classes

 

Sujets relatifs
[JS] multiples changement de classes sur un seul onmouseoverVBA Excel 2007 Problème de variable objet. Erreur 91
Aide : VBA SELECTION une colonne entière sous condition bugVBA - Selections lignes tableau sous Excel
copier lignes excel et coller dans corps de mail outlook (VBA)[VBA Excel] Keycode -> ? [Résolu]
[VBA] Dernière ligne vide dans un fichier excel videVBA Excel Remplacer retour chariot par saut cellule
VBA: collage speciale de texte provenant du presse papier vers ExcelCertificat Excel - VBA
Plus de sujets relatifs à : [VBA] Une sombre histoire de collection de classes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR