Collection [Résolu]

Signaler
Messages postés
10
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
18 janvier 2009
-
Messages postés
60
Date d'inscription
samedi 17 juin 2006
Statut
Membre
Dernière intervention
19 octobre 2009
-
Bonjour,

Je viens de découvrir les "collections" et je reste bloqué sur un problème :

Ce qui marche...
dim col as collection
set col = new collection
col.add "toto1"
col.add "toto2"
set col = nothing

Si je mets le "dim col as collection" en haut d'un module, pour que ma collection soit disponible partout dans ce module.Comment faire pour savoir si il y a eu le "set col = new collection" ?

Je n'arrive pas a faire un test sur ma collection "col" pour savoir si elle a déjà été créer ou pas, afin de ne pas l'effacer et de pouvoir venir remplir ma collection dans une autre fonction du module.

J'ai testé ça et ça à pas marché, help ;)
if collection null then set col new collection
ou
if collection = nothing then ...
ou
if collection = empty then ...

Merci.

11 réponses

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Bonjour,
Pourquoi ne pas créer ton objet col dans sa déclaration ?
Dim col as new collection
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Oui, ou faire le Set dans la Sub Main (ou le Form_Load si pas de Main) de ton projet.
Si tu dois utiliser une Collection, autant la déclarer dès le début, comme ça tu es sûr de ne pas l'oublier.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour





<hr />
>Je n'arrive pas a faire un test sur ma collection "col" pour savoir si elle a déjà été créer ou pas


Si tu suis les conseils de Willy et Jack, la question ne se pose plus, car ta collection sera créée automatiquement.<hr />>if collection null then set col new collection
ou
if collection = nothing then ...
ou
if collection = empty then ...

Pourquoi fais-tu un test sur le mot collection ? Ce n'est pas un nom d'objet (col ?). Cela aurait dû générer une erreur -> n'oublie pas Option Explicit. Pour savoir si ta collection col est vide, tu peux tester sa propriété col.Count
<hr />
Amicalement
Messages postés
10
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
18 janvier 2009

Merci à tous pour votre aide, mais j'ai pas du en dire assez, en faite, je veux regrouper plein de petites sous-fonctions dans un module et le rendre le plus indépendant possible, du style, une personne qui utilise mon module, doit juste avoir la liste des fonctions disponible et le reste doit se gérer tout seul.

Du style si la personne tape "mon_module" et le "." il voit créer, supprimer, modifier et rien d'autre, pas de collection à créer, gérer, déclarer, etc...

Donc même l'utilisation du "set", j'aimerais qu'il le fasse qu'une fois et tout seul, pour ça je peux toujours créer un booleen qui une fois fait le 1er "set"passe me bloc arès les autre appel au "set", mais c'et pas très propre je trouve...

Je voulais donc savoir si il n'y avait pas la possibilité de savoir si un "set" avait été fait avec une collection, la solution du col.count, ne passe pas non plus car pour lui, si le "set .... new...." n'est pas fait, il n'existe pas... donc pas moyen de trouver des informations dessus comme le ".count" et pourtant dans la fenêtre espion il est Empty, il sait qu'il y a eu le "dim" mais pas moyen de controler la "set"...

Je me pose la question, si c'est possible, car quand on demande a VB6 de créer une collection avec des class, il créer des trucs du style "init" et "close" mais pas de test du style que je cherche...

P.S. Orohena, oui c'est bien col et pas collection dans mon exemple, j'ai mal présenté ce petit bout de code ;) et merci willi et jack d'avoir essayé...


 
Messages postés
60
Date d'inscription
samedi 17 juin 2006
Statut
Membre
Dernière intervention
19 octobre 2009

Salut
ton probleme se regle lors de la declaration
dim col as collection
puis ailleur dans ton module ou tes fonction tu dois alor instancier cette collection,c'est pour cela que t'utilise ensuite
set col = new collection


En réalité tu peux automatiquement l'instancier lors de sa declaration
dim col as new collection
Et c'est tout!!!
pour mieux comprendre essaye d'appeler la methode count de ta collection avec les deux types de declaration et tu verra!
dim col as collection    ' dans le module en general

msgbox col.Count     ' ailleur dans ton module ou meme un form
'VB t'afichera une erreur car il attend la ligne 'set col ok
metnant avec dim col as new collection tu aura 0 en count sans erreur.Et pour rendre cette collection utilsable a partir de ton module tu le declare en public.(public col as new collection)






 

[mailto:Sk@yL S]
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
D'après ta description, je pense que tu veux parler de classe.


En effet, une collection ne dispose que de deux méthodes (add et remove) et deux propriétés (item et count).


A l'inverse, dans un module de classe, tu peux coller tes fonctions (créer, supprimer, modifier...), et il suffit pour l'utilisateur de créer un objet à partir de cette classe, pour qu'elle puisse utiliser tes fonctions exactement de la façon dont tu l'expliques.

Je te donne un exemple théorique avant de passer à la pratique :



Set mon_module = New maClasse   ' l'utilisateur créé un objet de la classe maClasse pour pouvoir utiliser tes fonctions
mon_module.creer                            '
mon_module.modifier                       ' l'utilisateur exécute tes fonctions (= méthodes de l'objet mon_module)
mon_module.supprimer                    '


Voici un exemple pratique, qui doit fonctionner :

1. Colle ton code dans un module de classe appelé class1
(ce nom est peu parlant, on va donc le modifier un peu plus bas)


<hr />
Option Explicit
Private vnom As String                     ' variable affectée à la propriété nom
Property Get nom() As String            ' lecture de la propriété nom
      nom = vnom
End Property
Property Let nom(pnom As String)    ' écriture de la propriété nom
      vnom = pnom
End Property
Function creer()                               ' méthode créer
'   ... <code de création>
   creer = True       
End Function

<hr />2. Remplacer le nom du module de classe par identite :
Dans le module de classe class1 :
  - appuyer sur F4 pour ouvrir la fenêtre de propriétés (ou bien, menu Affichage>fenêtre propriétés)
  - puis remplacer class1 par identite dans la propriété Name
<hr /> 3. Colle le code de l'utilisateur dans un module :

<hr />Option Explicit
Sub userCode()
   Dim employe1 As New identite                           ' déclare et crée un objet de classe identite
   Dim employe2 As New identite                           ' id.
   employe1.nom = "Jean"                                       ' ecriture de la propriete nom de l'employé 1
   employe2.nom = "Pierre"                                     ' ecriture de la propriete nom de l'employé 2
   msgbox employe1.name                                      ' lecture de la propriete nom de l'employé 1
   If employe1.creer = True Then _
         msgbox "Création de " & vnom & " effectuée"   ' simulation d'une création concernant l'employé 1
End Sub
<hr />
Amicalement
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Pardon, les 4 dernières lignes de mon code sont :



msgbox employe1.nom                                     
' lecture de la propriete nom de l'employé 1

   If employe1.creer = True Then _
         msgbox "Création de " & employe1.nom & " effectuée"   
' simulation d'une création concernant l'employé 1
End Sub
Messages postés
10
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
18 janvier 2009

Merci à tous...
Réponse rapide, précise, et avec exemple, le rêve...

Je vais donc pour mom module que je souhaite le plus indépendant possible utiliser la solution de "Skyla", vérifier, ça marche dans ce cas bien précis.

Sinon, l'exemple de "Orohena" est utile pour la gestion de mes autres autres "class" et "collection" et sera très utile pour ceux qui début aussi.


Cordialement.


Phénix
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
A tester :
Une Collection non initialisée n'aurait-elle pas sa propriété Count à -1 ?
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,

if truc is nothing then set truc = new collection
++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
60
Date d'inscription
samedi 17 juin 2006
Statut
Membre
Dernière intervention
19 octobre 2009

Non je ne crois pas,des que j'appelle une méthode de la collection non initialisée
VB ramene l'erreur
"Variable objet ou variable bloc With non definie" sinon 0 avec initialisation
ex 1:
Dim b As Collection
MsgBox b.Count         '



On obtient l'erreur








ex2:





Dim b As NEW Collection

MsgBox b.Count         '





retourne 0

























<sup>
[mailto:Sk@yL


S


]
</sup>



<sub>


</sub>