Liaison Module de classe pour DLL

drouault Messages postés 73 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 14 août 2007 - 13 août 2007 à 17:38
drouault Messages postés 73 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 14 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 :-))

Merci d'avance

Pierre

3 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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

'=================================================================================

'propriété item

'*** moi je fais
différement :
'Public Property Get
item(vntIndexKey As Variant) As Type_gcou
'    Set
item = macoll.item(vntIndexKey)
'End
Property

' Comme ceci :

Public Sub Item(ByRef oObject As Type_gcou, ByVal lID As
Long)
    Set oObject = macoll.Item(lID)
End Sub

' et pour
l'utiliser :
' t'as une classe qui s'appelle
Type_gcou, l'autre, _
ne la connaissant pas je vais l'appeler MyColObj
:

    Dim TEMP_Type_gcou As New Type_gcou, MyColObj As New MyColObj
    Dim i As Long

For i = 1 To MyColObj.count
    Call MyColObj.lngItem(TEMP_Type_gcou, i)
    
    MsgBox TEMP_Type_gcou.refdoc
    MsgBox TEMP_Type_gcou.link
    MsgBox TEMP_Type_gcou.libelle
    MsgBox TEMP_Type_gcou.letype
    
    Set TEMP_Type_gcou = Nothing
Next i

~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
13 août 2007 à 18:44
remplace
    Call MyColObj.lngItem(TEMP_Type_gcou, i)
par
    Call MyColObj.Item(TEMP_Type_gcou, i)

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
drouault Messages postés 73 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 14 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

unevaleurcollection = toto.gcour.item(i).letype

Ce n'est peut être pas possible ...

Merci déjà pour les réponses apportées ...

A+

Pierre
0
Rejoignez-nous