Définir une propriété de classe par défaut

Imy

XLDnaute Nouveau
Bonjour,

Dans Excel on peut utiliser l'objet 'Range' de plusieurs manières :
Code:
 Range.("A1").value=Text1.text
Text1.text=Range.("A1").value

'Ou comme 'Value' est par défaut :

Range.("A1")=Text1.text
Text1.text=Range.("A1")

J'ai créé une classe qui définit une collection dans laquelle j'identifie un élément par une propriété 'item' (get et let).

Suivant ce lien Default Member Of A Class, je m'en vais définir cette propriété par défaut.

Hors si cela marche bien :
Code:
Macollection(1)=Variable
Cela non :
Code:
Variable=Macollection(1)

Naturellement cela passe pour le compilateur VBA :
Code:
Macollection.item(1)=Variable
Variable=MaCollection.item(1)

N'est-t-il pas possible d'avoir la propriété (get et let) définie par défaut dans les deux sens (comme celles d'excel:confused:)?

Merci d'avance!
 

Imy

XLDnaute Nouveau
Re : Définir une propriété de classe par défaut

Voici le code de ma classe (lue par un éditeur de texte et non par VBE) :
Code:
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "CL_GroupeInformation_Coll"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
'//////////////////////////////////////////////////////// MODULE DE CLASSE
Option Explicit

'### ENUMERATIONS/TYPES

'### VARIABLES
Private m_Coll As Collection


'###INITIALISATION ET FINALE
Private Sub Class_Initialize()
    Set m_Coll = New Collection
End Sub

Private Sub Class_Terminate()
    Set m_Coll = Nothing
End Sub


'###PROPRIETES
Public Property Get Item(ByVal vntIndexKey As Variant) As CL_GroupeInformation
Attribute Item.VB_UserMemId = 0
On Error Resume Next
    Set Item = m_Coll(vntIndexKey)
End Property
Public Property Let Item(ByVal vntIndexKey As Variant, ByVal Valeur As CL_GroupeInformation)
On Error Resume Next
    Set m_Coll(vntIndexKey) = Valeur
End Property

Public Property Get Count() As Long
    Count = m_Coll.Count
End Property


'###PROCEDURES
Public Function Add(Optional ByVal Key As String) As CL_GroupeInformation
On Error GoTo er

Dim OBJ As Object, NObj As CL_GroupeInformation

Set NObj = New CL_GroupeInformation
    
'NObj.Key = key
    
m_Coll.Add NObj, Key
    
Set Add = NObj
Set NObj = Nothing

Exit Function
'Traitement des erreurs
er:
If vbYes = MsgBox("Erreur dans la définition de l'objet groupe d'information (Clé :" & Key & ")" & vbCrLf & vbCrLf & _
"Voulez-vous arrêter l'exécution du programme?", vbExclamation + vbYesNo) Then
    End
End If
End Function

Public Sub Remove(ByVal VIndex As Variant)
    m_Coll.Remove VIndex
End Sub

Public Function NewEnum() As IUnknown
   Set NewEnum = m_Coll.[_NewEnum]
End Function

Public Sub Clear()
Dim I As Long

If m_Coll.Count = 0 Then Exit Sub

Do While m_Coll.Count <> 0
    m_Coll.Remove m_Coll.Count
Loop
End Sub

Pourquoi, au fond, la fonction par défaut est 'get' et pas 'let' puisque toutes deux portent le même nom 'item'? Pour que cela soit la fonction 'let' qui soit par défaut, il faut que j'inverse l'ordre de définition, écrire en premier la let puis après la get:p?

Je ne comprends pas pourquoi le compilateur sait faire la différence lorsque il faut utiliser la 'get' ou la 'let' en temps normal, et ici, après mon essai de mise par défaut, il ne semble plus faire la distinction automatique entre les deux types de propriétés...

Est-ce j'ai fait une erreur s'il vous plaît?:confused:

PS : 'CL_GroupeInformation' est une autre classe de définition de l'élément dans laquelle se trouve quatre variables publiques de type long
 

Imy

XLDnaute Nouveau
Re : Définir une propriété de classe par défaut

Lorsque j'écris la variable objet (Variableobjet(1)=....) : le compilateur lit la property get et à la fin me renvoit une erreur 438 (propriété ou méthode non gérée par cet objet) avant même de lire la property let. Y-a-t-il un problème?
 

Imy

XLDnaute Nouveau
Re : Définir une propriété de classe par défaut

:mad:Ha! il semble que cela ne vienne pas uniquement du fait de la définition par défaut de la property get 'item'!

En effet , j'ai réessayé en otant la ligne avec attribute, et c'est la collection qui ne peut être écrite :
Code:
Collection.item(1).propriete=10
cela ne marche pas , alors que :
Code:
Variable=Collection.item(1).propriete
Marche !

Comment la collection listitems de l'objet VB listview peut-elle fonctionner puisque j'utilise sans problème listitems(1)=20 et Variable=listitems(1).text?
 

Discussions similaires

Statistiques des forums

Discussions
312 792
Messages
2 092 145
Membres
105 235
dernier inscrit
loisipubm