drouault
Messages postés73Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention14 août 2007
-
13 août 2007 à 17:38
drouault
Messages postés73Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention14 août 2007
-
14 août 2007 à 08:39
Bonjour,
J'ai un souci que je n'arrive pas à résoudre mais qui doit pourtant être assez simple. Je débute dans la programmation avec les modules de classes et je souhaite pouvoir utiliser une collection.
J'ai donc créer mon type dans un module de classe :
Private strrefdoc As String
Private strlink As String
Private strlibelle As String
Private strctype As String
Property Let refdoc(ByVal data As String)
strrefdoc = data
End Property
Property Let link(ByVal data As String)
strlink = data
End Property
Property Let libelle(ByVal data As String)
strlibelle = data
End Property
Property Let letype(ByVal data As String)
strctype = data
End Property
Property Get refdoc() As String
refdoc = strrefdoc
End Property
Property Get link() As String
link = strlink
End Property
Property Get libelle() As String
libelle = strlibelle
End Property
Property Get letype() As String
letype = strctype
End Property
Dans un autre module de classe, j'ai mis le code qui permet d'ajouter, de supprimer ou d'accéder à un item de la collection :
Private macoll As Collection
'innitialisation
Private Sub class_initialize()
Set macoll = New Collection
End Sub
'méthode add
Public Function add(ByVal refdoc As String, ByVal link As String, ByVal libelle As String, ByVal letype As String)
Dim myObj As New Type_gcou
'--------------------
myObj.refdoc = refdoc
myObj.link = link
myObj.libelle = libelle
myObj.letype = letype
'--------------------
macoll.add myObj
Set add = myObj
Set myObj = Nothing
'--------------------
End Function
'méthode remove
Public Sub remove(vntIndexKey As Variant)
macoll.remove vntIndexKey
End Sub
'propriété item
Public Property Get item(vntIndexKey As Variant) As Type_gcou
Set item = macoll(vntIndexKey)
End Property
'propriété count
Public Property Get count() As Long
count = macoll.count
End Property
'fin
'destruction de la collection
Private Sub class_terminate()
Set macoll = Nothing
End Sub
Ce que je souhaite, c'est pouvoir ensuite accéder aux informations de ma collection à partir d'une propriété de mon module de classe principale, et c'est là que je bloque. Et la je n'arrive pas à accéder à mes différents Item, je pense que j'ai un souci dans ma déclaration des ces deux modules de classe dans mon module de classe principale.
J'ai essayé avec ça mais ça ne fonctionne pas :
Public Property Set Type_Courrier(ByVal type_cou As Type_gcou)
If type_cou Is Nothing Then
Set type_cou = New Type_gcou
End If
'Dans un cas comme dans l'autre l'objet est valide donc
Set Mes_Courriers = type_cou
End Property
Public Property Set Mes_Courriers(ByVal mescourriers As Coll_cou)
If mescouriers Is Nothing Then 'Si la collection n'existe pas
Err.Raise vbObjectError + 2, "mescouriers", "Il faut lire le fichier avant de consulter la collection"
Else
Set Mes_Courriers = mescouriers 'on donne acces à la collection
End If
End Property
Si quelqu'un voit une solution ou peut m'orienter vers une source bien expliquée ...
En espérant avoir été à peu prés clair (j'en suis pas sur :-))
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 13 août 2007 à 18:43
salut,
je t'ai mis deux commentaires dans la première partie, la seconde c'est ce que je te propose, je fais un peu différemment, pas sûr que ce soit la meilleure méthode, mais bon :
Option Explicit
Private macoll As Collection
'innitialisation
Private Sub class_initialize()
Set macoll = New Collection
End Sub
'méthode
add
' **** Pas function, mais Sub :
****
Public Sub add(ByVal refdoc As String, ByVal link
As String, ByVal libelle As String, ByVal letype As String)
Dim myObj As New Type_gcou
'--------------------
myObj.refdoc = refdoc
myObj.link = link
myObj.libelle = libelle
myObj.letype = letype
'--------------------
macoll.add myObj
' ****
inutile : ****
'Set add =
myObj
Set myObj = Nothing
'--------------------
End Sub
'méthode
remove
Public Sub remove(vntIndexKey As Variant)
macoll.remove vntIndexKey
End Sub
'propriété
count
Public Property Get count() As Long
count = macoll.count
End Property
'fin
'destruction de la collection
Private Sub class_terminate()
Set macoll = Nothing
End Sub
drouault
Messages postés73Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention14 août 2007 14 août 2007 à 08:39
Merci beaucoup de ton aide ...
J'ai modifier un peu le code suivant tes exemples et si ça te dérange pas j'aurais quelques questions à te poser vu que ça ne fonctionne
pas trés bien encore :-) :
-> J'ai un souci avec mon count, j'ai mis un msgbox dans ma dll qui me renvoie le bon nombre d'enregistrements de la table, et quand j'appelle ensuite ma propriété Count dans un projet (comme avec ta méthode), il me renvoit zéro ... Je pense que j'ai du faire une boulette en laissant trainer un nothing quelque part peut être ?! Du coup, j'accéde pas à l'item, même si maintenant, grâce à ta méthode, je pense que ça va fonctionner car j'ai la saisie assistée que j'avais pas avant ...
-> Est'il possible de ne déclarer qu'un seul objet dans la dll pour accéder à tous les autres. Dans mon exemple :
gcourriers : module de classe "principale"
coll_cou : module de classe avec Add, Remove, Item
type_gcou : module de classe avec mon type
Est 'il possible d'arriver à ça dans l'application, au travers d'une propriété que je déclarerais dans le module de classe gcourriers et qui ferait référence aux autres modules de classe (gcour par exemple pour le nom de la propriété) :
Dim toto as New gcourriers
Dim unevaleurcollection as string