OVH Cloud OVH Cloud

Problème de classe!

2 réponses
Avatar
Sébastien Côté
Bonjour à tous!

Voila mon problème, j'utilise une classe nommée FacturesVentes ou je dois
déterminer les propriétés de ma facture (par exemple la date, le no du
client, etc.). Jusqu'ici tout va bien, j'utilise la syntaxe du genre:

Private m_sNom As String
Public Property Get Nom() As String
Nom = m_sNom
End Property
Public Property Let Nom(ByVal sNom As String)
m_sNom = sNom
End Property

Donc, je crée ma facture en faisant
dim x as new Facture
x.Nom = "Petit Client"

Et tout va bien. Maintenant j'aimerais avoir une propriété de type
utilisateur que je définis dans un module afin de définir chaque ligne de ma
facture, afin de programmer ainsi:

x.Ligne(1).NoProduit="00001"
x.Ligne(1).Quantité=1
x.Ligne(2).NoProduit="00002"
x.Ligne(2).Quantité=1

Ca serait vraiment génial si l'un de vous pouvait m'aider dans cette voie
car je ne peux définir un type utilisateur dans une propriété!

Merci beaucoup

Sébas

2 réponses

Avatar
Sebho
Je pense qu'il faut que tu attaques ton problème avec une collection
utilises l'assistant création de classes pour créer

Classe Facture (Nouvelle classe)
Classe Lignes (Nouvelle collection basée sur nouvelle classe)
Classe Ligne (Nouvelle Classe pour la collection)
Propriété NoProduit as string (Nouvelle Propriete Get/Let/Set)
Propriété Quantite as long (Nouvelle Propriete Get/Let/Set)

Puis dans ta form

Dim o As New Facture
o.Lignes.Add "F1", "00001", 1
o.Lignes.Add "F2", "00002", 1

F1 et F2 sont une clé qui doit etre unique dans la collection (la référence
de la facture), mais rien ne t'empèche d'enlever la cle

Sebho

PS si tu n'arrive pas voici le code que j'ai essayé, tu peux le
copier/coller dans trois classes, bon courage

'***************************************
'Classe Facture
'***************************************
Option Explicit

Private mvarLignes As Lignes

Public Property Get Lignes() As Lignes
If mvarLignes Is Nothing Then
Set mvarLignes = New Lignes
End If

Set Lignes = mvarLignes
End Property

Public Property Set Lignes(vData As Lignes)
Set mvarLignes = vData
End Property
Private Sub Class_Terminate()
Set mvarLignes = Nothing
End Sub

'***************************************
'Classe Lignes
'***************************************

Option Explicit

'variable locale pour la collection
Private mCol As Collection

Public Function Add(Key As String, NoProduit As String, Quantite As Long,
Optional sKey As String) As Ligne
'créer un nouvel objet
Dim objNewMember As Ligne
Set objNewMember = New Ligne

'définir les propriétés passées à la méthode
objNewMember.Key = Key
objNewMember.NoProduit = NoProduit
objNewMember.Quantite = Quantite
If Len(sKey) = 0 Then
mCol.Add objNewMember
Else
mCol.Add objNewMember, sKey
End If

'renvoyer l'objet créé
Set Add = objNewMember
Set objNewMember = Nothing

End Function

Public Property Get Item(vntIndexKey As Variant) As Ligne
'Utilisé pour référencer un élément dans la collection
'vntIndexKey contient l'index ou la clé dans la collection
'Il est donc déclaré en tant que Variant
'Syntaxe: Set toto = x.Item(xyz) ou Set toto = x.Item(5)
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long
'utilisée pour lire le nombre d'éléments dans la
'collection. Syntaxe: Debug.Print x.Count
Count = mCol.Count
End Property

Public Sub Remove(vntIndexKey As Variant)
'utilisée lors de la suppression d'un élément de la collection
'vntIndexKey contient l'index ou la clé, il est donc
'déclaré en tant que Variant
'Syntaxe: x.Remove(xyz)

mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown
'Cette propriété vous permet d'énumérer
'cette collection avec la syntaxe For...Each
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()
'Crée la collection lorsque cette classe est créée
Set mCol = New Collection
End Sub

Private Sub Class_Terminate()
'Détruit la collection lorsque cette classe est détruite
Set mCol = Nothing
End Sub

'***************************************
'Classe Ligne
'***************************************
Option Explicit

Public Key As String

'variables locales de stockage des valeurs de propriétés
Private mvarNoProduit As String 'copie locale
Private mvarQuantite As Long 'copie locale
Public Property Let Quantite(ByVal vData As Long)
'utilisé lors de l'affectation d'une valeur à la propriété, du coté gauche
de l'affectation.
'Syntax: X.Quantite = 5
mvarQuantite = vData
End Property

Public Property Get Quantite() As Long
'utilisé lors de la lecture de la valeur de la propriété, du coté droit de
l'instruction.
'Syntax: Debug.Print X.Quantite
Quantite = mvarQuantite
End Property

Public Property Let NoProduit(ByVal vData As String)
'utilisé lors de l'affectation d'une valeur à la propriété, du coté gauche
de l'affectation.
'Syntax: X.NoProduit = 5
mvarNoProduit = vData
End Property

Public Property Get NoProduit() As String
'utilisé lors de la lecture de la valeur de la propriété, du coté droit de
l'instruction.
'Syntax: Debug.Print X.NoProduit
NoProduit = mvarNoProduit
End Property
Avatar
Sébastien Côté
Un grand merci, ca devrait faire l'affaire!

Seb

"Sebho" a écrit dans le message de
news:%
Je pense qu'il faut que tu attaques ton problème avec une collection
utilises l'assistant création de classes pour créer

Classe Facture (Nouvelle classe)
Classe Lignes (Nouvelle collection basée sur nouvelle classe)
Classe Ligne (Nouvelle Classe pour la collection)
Propriété NoProduit as string (Nouvelle Propriete Get/Let/Set)
Propriété Quantite as long (Nouvelle Propriete Get/Let/Set)

Puis dans ta form

Dim o As New Facture
o.Lignes.Add "F1", "00001", 1
o.Lignes.Add "F2", "00002", 1

F1 et F2 sont une clé qui doit etre unique dans la collection (la


référence
de la facture), mais rien ne t'empèche d'enlever la cle

Sebho

PS si tu n'arrive pas voici le code que j'ai essayé, tu peux le
copier/coller dans trois classes, bon courage

'***************************************
'Classe Facture
'***************************************
Option Explicit

Private mvarLignes As Lignes

Public Property Get Lignes() As Lignes
If mvarLignes Is Nothing Then
Set mvarLignes = New Lignes
End If

Set Lignes = mvarLignes
End Property

Public Property Set Lignes(vData As Lignes)
Set mvarLignes = vData
End Property
Private Sub Class_Terminate()
Set mvarLignes = Nothing
End Sub

'***************************************
'Classe Lignes
'***************************************

Option Explicit

'variable locale pour la collection
Private mCol As Collection

Public Function Add(Key As String, NoProduit As String, Quantite As Long,
Optional sKey As String) As Ligne
'créer un nouvel objet
Dim objNewMember As Ligne
Set objNewMember = New Ligne

'définir les propriétés passées à la méthode
objNewMember.Key = Key
objNewMember.NoProduit = NoProduit
objNewMember.Quantite = Quantite
If Len(sKey) = 0 Then
mCol.Add objNewMember
Else
mCol.Add objNewMember, sKey
End If

'renvoyer l'objet créé
Set Add = objNewMember
Set objNewMember = Nothing

End Function

Public Property Get Item(vntIndexKey As Variant) As Ligne
'Utilisé pour référencer un élément dans la collection
'vntIndexKey contient l'index ou la clé dans la collection
'Il est donc déclaré en tant que Variant
'Syntaxe: Set toto = x.Item(xyz) ou Set toto = x.Item(5)
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long
'utilisée pour lire le nombre d'éléments dans la
'collection. Syntaxe: Debug.Print x.Count
Count = mCol.Count
End Property

Public Sub Remove(vntIndexKey As Variant)
'utilisée lors de la suppression d'un élément de la collection
'vntIndexKey contient l'index ou la clé, il est donc
'déclaré en tant que Variant
'Syntaxe: x.Remove(xyz)

mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown
'Cette propriété vous permet d'énumérer
'cette collection avec la syntaxe For...Each
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()
'Crée la collection lorsque cette classe est créée
Set mCol = New Collection
End Sub

Private Sub Class_Terminate()
'Détruit la collection lorsque cette classe est détruite
Set mCol = Nothing
End Sub

'***************************************
'Classe Ligne
'***************************************
Option Explicit

Public Key As String

'variables locales de stockage des valeurs de propriétés
Private mvarNoProduit As String 'copie locale
Private mvarQuantite As Long 'copie locale
Public Property Let Quantite(ByVal vData As Long)
'utilisé lors de l'affectation d'une valeur à la propriété, du coté gauche
de l'affectation.
'Syntax: X.Quantite = 5
mvarQuantite = vData
End Property

Public Property Get Quantite() As Long
'utilisé lors de la lecture de la valeur de la propriété, du coté droit de
l'instruction.
'Syntax: Debug.Print X.Quantite
Quantite = mvarQuantite
End Property

Public Property Let NoProduit(ByVal vData As String)
'utilisé lors de l'affectation d'une valeur à la propriété, du coté gauche
de l'affectation.
'Syntax: X.NoProduit = 5
mvarNoProduit = vData
End Property

Public Property Get NoProduit() As String
'utilisé lors de la lecture de la valeur de la propriété, du coté droit de
l'instruction.
'Syntax: Debug.Print X.NoProduit
NoProduit = mvarNoProduit
End Property