OVH Cloud OVH Cloud

Collections et Types utilisateurs

4 réponses
Avatar
HervéR
Bonjour à tous,

Je commence à utiliser les collections (je n'ai pour l'instant mis en oeuvre
que des collections de chaînes !) et ne vois pas comment ajouter un item qui
soit d'un type de mon cru.
Je m'explique :
Soit le type (défini en tête de module) :
Private Type CtlAutorisé
Login As String
NomControle As String
End Type
A l'intérieur d'un Sub, je déclare la collection
Dim CtlConditionnel As New Collection
Je voudrais ajouter la donnée de type CtlAutorisé ("User1","MonControle")
Je me fais donc un petit
Dim CtlAutoriséTemp As CtlAutorisé
CtlAutoriséTemp.Login = "User1"
CtlAutoriséTemp.NomControle = "MonControle"
puis
CtlConditionnel.Add CtlAutoriséTemp
Et là, je me choppe le message "Seuls les types publics définis par
l'utilisateur dans les modules objet publics peuvent être utilisés comme
paramètres ou types renvoyés pour les procédures publiques des modules de
classe ou comme champs des types publics définis par l'utilisateur"
Message qui ne me parle pas du tout !

Parle-t-il à quelqu'un qui pourrait m'en parler ;-)
Merci d'avance...

4 réponses

Avatar
Raymond [mvp]
Bonjour.

je crois que tu confonds un type de données avec une collection.
les deux étant très longs à expliquer ici, et l'aide en ligne étant claire,
je me permet de t'y renvoyer. dans le code tu tapes type et collection, tu
sélectionnes un mot et tu fais F1, puis l'autre.
à mon avis ce que tu veux c'est un type de données.
Tu trouveras un exemple de type de données dans l'api GetOpenFileName (
donnée Public Type OpenFileName) et tu verras comment charger chaque
élément. http://access.seneque.free.fr/ouverture_document.htm
Si c'est une collection que tu veux tu n'as pas besoin de type .
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"HervéR" a écrit dans le message de
news:
Bonjour à tous,

Je commence à utiliser les collections (je n'ai pour l'instant mis en
oeuvre

que des collections de chaînes !) et ne vois pas comment ajouter un item
qui

soit d'un type de mon cru.
Je m'explique :
Soit le type (défini en tête de module) :
Private Type CtlAutorisé
Login As String
NomControle As String
End Type
A l'intérieur d'un Sub, je déclare la collection
Dim CtlConditionnel As New Collection
Je voudrais ajouter la donnée de type CtlAutorisé ("User1","MonControle")
Je me fais donc un petit
Dim CtlAutoriséTemp As CtlAutorisé
CtlAutoriséTemp.Login = "User1"
CtlAutoriséTemp.NomControle = "MonControle"
puis
CtlConditionnel.Add CtlAutoriséTemp
Et là, je me choppe le message "Seuls les types publics définis par
l'utilisateur dans les modules objet publics peuvent être utilisés comme
paramètres ou types renvoyés pour les procédures publiques des modules de
classe ou comme champs des types publics définis par l'utilisateur"
Message qui ne me parle pas du tout !

Parle-t-il à quelqu'un qui pourrait m'en parler ;-)
Merci d'avance...




Avatar
Rv
Salut Raymond,

Je ne comprends pas pourquoi il est aberrant d'insèrer une variable d'un
type défini par l'utilisateur dans une collection! Et donc je ne pige pas
pourquoi ce message d'erreur d'access...
Help please?

Merci

Rv

"Raymond [mvp]" a écrit dans le message de
news:%
Bonjour.

je crois que tu confonds un type de données avec une collection.
les deux étant très longs à expliquer ici, et l'aide en ligne étant
claire,

je me permet de t'y renvoyer. dans le code tu tapes type et collection, tu
sélectionnes un mot et tu fais F1, puis l'autre.
à mon avis ce que tu veux c'est un type de données.
Tu trouveras un exemple de type de données dans l'api GetOpenFileName (
donnée Public Type OpenFileName) et tu verras comment charger chaque
élément. http://access.seneque.free.fr/ouverture_document.htm
Si c'est une collection que tu veux tu n'as pas besoin de type .
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


Avatar
HervéR
Non, je ne crois pas mélanger les deux notions !
J'ai lu dans un livre que les collections remplaçaient avantageusement les
tableaux. L'exemple donné, dont je me suis inspiré, se contentait de donner
un exemple simple d'ajout de chaînes dans une collection.
Je vois comme avantage à l'utilisation des collections la possibilité de
leur ajouter des éléments sans avoir à s'occuper de leur nombre, comme il
faut le faire quand on utilise un tableau.
Pour avancer dans mon appli, j'ai utilisé le code suivant, en tête du module
:
Private Type CtlAutorisé
Login As String
NomControle As String
End Type
Puis, dans le Sub :
Dim CtlConditionnelTab() As CtlAutorisé
Dim TailleTableau As Integer
[Définition et ouverture du RecordSet "MonRecordSet"]
TailleTableau = 0
Do Until MonRecordSet.EOF
With MonRecordSet
ReDim Preserve CtlConditionnelTab(TailleTableau) As CtlAutorisé
CtlConditionnelTab(TailleTableau).Login = !Login
CtlConditionnelTab(TailleTableau).NomControle = !NomControle
TailleTableau = TailleTableau + 1
.MoveNext
End With
Loop
If TailleTableau > 0 Then TailleTableau = TailleTableau - 1
Ce que je voudrais faire, c'est donc bel et bien charger ma collection avec
des éléments typés.
D'où ma déclaration de la variable
Dim CtlAutoriséTemp As CtlAutorisé
et la tentative, lors du parcours du RecordSet, d'insérer les données dans
ma collection avec :
CtlAutoriséTemp.Login = !Login
CtlAutoriséTemp.NomControle = !NomControle
CtlConditionnel.Add CtlAutoriséTemp

Mais peut-être n'est-ce pas possible !


"Raymond [mvp]" a écrit dans le message de
news:%
Bonjour.

je crois que tu confonds un type de données avec une collection.
les deux étant très longs à expliquer ici, et l'aide en ligne étant
claire,

je me permet de t'y renvoyer. dans le code tu tapes type et collection, tu
sélectionnes un mot et tu fais F1, puis l'autre.
à mon avis ce que tu veux c'est un type de données.
Tu trouveras un exemple de type de données dans l'api GetOpenFileName (
donnée Public Type OpenFileName) et tu verras comment charger chaque
élément. http://access.seneque.free.fr/ouverture_document.htm
Si c'est une collection que tu veux tu n'as pas besoin de type .
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


Avatar
Raymond [mvp]
RE.

Tu peux très bien remplacer un tableau sans aller définir un type. je te
donne l'exemple de l'aide en ligne qui fonctionne très bien. il te suffira
de remplacer le inputbox par ton recordset.
1- tu crées un module de classe nommé "Class1" dans lequel tu mets:
Public InstanceName
2- dans ton formulaire tu crées un bouton commande0 avec le code:
Private Sub Commande0_Click()
ClassNamer
End Sub
3- tu places ce code dans un module ou dans ton formulaire:
Sub ClassNamer()
Dim MyClasses As New Collection
Dim Num
Dim Msg As String
Dim TheName, MyObject, NameList
Do
Dim Inst As New Class1
Num = Num + 1
Msg = "Veuillez affecter un nom à cet objet." & Chr(13) _
& "Appuyez sur Annuler pour afficher les noms présents" _
& "dans la collection."
TheName = InputBox(Msg, "Nommez les éléments de Collection")
Inst.InstanceName = TheName
If Inst.InstanceName <> "" Then
MyClasses.Add Item:=Inst, Key:=CStr(Num)
End If
Set Inst = Nothing
Loop Until TheName = ""
For Each MyObject In MyClasses
NameList = NameList & MyObject.InstanceName & Chr(13)
Next MyObject
MsgBox NameList, , "Noms des instances présentes dans la" _
& "collection MyClasses"

For Num = 1 To MyClasses.Count
MyClasses.Remove 1
Next
End Sub

en cliquant sur le bouton, tu entres plusieurs noms, tu termines par entrée
sans composer
access t'affiche les noms entrés et les supprime

ça devrait t'aider pour avancer.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"HervéR" a écrit dans le message de
news:
Non, je ne crois pas mélanger les deux notions !
J'ai lu dans un livre que les collections remplaçaient avantageusement les
tableaux. L'exemple donné, dont je me suis inspiré, se contentait de
donner

un exemple simple d'ajout de chaînes dans une collection.
Je vois comme avantage à l'utilisation des collections la possibilité de
leur ajouter des éléments sans avoir à s'occuper de leur nombre, comme il
faut le faire quand on utilise un tableau.
Pour avancer dans mon appli, j'ai utilisé le code suivant, en tête du
module

:
Private Type CtlAutorisé
Login As String
NomControle As String
End Type
Puis, dans le Sub :
Dim CtlConditionnelTab() As CtlAutorisé
Dim TailleTableau As Integer
[Définition et ouverture du RecordSet "MonRecordSet"]
TailleTableau = 0
Do Until MonRecordSet.EOF
With MonRecordSet
ReDim Preserve CtlConditionnelTab(TailleTableau) As CtlAutorisé
CtlConditionnelTab(TailleTableau).Login = !Login
CtlConditionnelTab(TailleTableau).NomControle = !NomControle
TailleTableau = TailleTableau + 1
.MoveNext
End With
Loop
If TailleTableau > 0 Then TailleTableau = TailleTableau - 1
Ce que je voudrais faire, c'est donc bel et bien charger ma collection
avec

des éléments typés.
D'où ma déclaration de la variable
Dim CtlAutoriséTemp As CtlAutorisé
et la tentative, lors du parcours du RecordSet, d'insérer les données dans
ma collection avec :
CtlAutoriséTemp.Login = !Login
CtlAutoriséTemp.NomControle = !NomControle
CtlConditionnel.Add CtlAutoriséTemp

Mais peut-être n'est-ce pas possible !