PHENIX2005
Messages postés10Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention18 janvier 2009
-
7 janv. 2009 à 18:21
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009
-
8 janv. 2009 à 22:27
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 ...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 7 janv. 2009 à 19:24
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)
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 7 janv. 2009 à 20:05
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
PHENIX2005
Messages postés10Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention18 janvier 2009 8 janv. 2009 à 00:30
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é...
Vous n’avez pas trouvé la réponse que vous recherchez ?
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 8 janv. 2009 à 01:49
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)
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 8 janv. 2009 à 02:30
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
PHENIX2005
Messages postés10Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention18 janvier 2009 8 janv. 2009 à 09:40
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.
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 8 janv. 2009 à 22:27
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 '