besoin d'aide sur les module de classe - VB/VBA/VBS - Programmation
Marsh Posté le 10-09-2006 à 23:30:51
Citation : "Seuls les types définis par l'utilisateur et qui sont définis dans des module d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive." |
Le message concerne plusieurs cas d'erreur, et il faudrait détermnier lequel est en cause ici :
1. Depuis ou vers un variant ?
2. Passé ou non à des fonctions à liaisons tardive ?
Le mot variant fait penser qu'il manquerait la déclaration d'un type de donnée dans la définition de la fonction. Malheureuseument, on ne voit comment la fonction, nimportequellefonction (joli nom !), est définie. Par ailleurs, le Setvariable me parait un peu étrange. Peut-être qu'en passant pas une variable intérmédiaire cela marcherait mieux :
Dim toto As String |
Marsh Posté le 11-09-2006 à 10:48:53
En fait je me suis gouré dans mon exemple (désolé)
Le cas se produit dans le contexte suivant :
Dim indice as long
indice = LigneExiste(Xml(f).Scenario(s).Setvariable(v))
Function LigneExiste(ByRef tableau As Variant) as long
On Error GoTo vide
LigneExiste= UBound(tableau)
Exit Sub
vide:
LigneExiste = -1
End Sub
Ca me donne ça :
"Seuls les types définis par l'utilisateur et qui sont définis dans des module d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive."
Indépendament de ce problème qui pourrait estre contourné en ayant des champs dans mes Type pour indiquer le nombre d'instance des sous tableaux les modules de classe me tentent bien pour des raison de propreté/compacité du code mais je ne comprends vraiment pas pourquoi ils ont mis une limitation aussi importnte sur les tableaux public, ça aurait été tellement puissant.
J'ai bien fait quelques essais en déclarant les sous tableaux en private et en essayant de les manipuler avec les property Get/Let mais j'arrive pas à grand chose.
Si quelqu'un a une idée ...
Marsh Posté le 12-09-2006 à 15:55:51
Pour récupérer un tableau - contenant des valeurs d'un type personnalisé - d'un module de classe :
- créer un module de classe pour le type personnalisé. Ici le module de classe est nommé TableauStyle, et voici un contenu comme exemple
Private m_Truc As String
Public Property Get Truc() As String
Truc = m_Truc
End Property
Public Property Let Truc(newValue As String)
m_Truc = newValue
End Property
Ailleurs, dans un autre module de classe (MaClasse pour l'exemple)
- déclarer une variable privée pour le tableau
Private variable_privee_tableau() As TableauStyle
- créer une propriété Get pour récupérer sa valeur
Public Property Get RecupTableau() As TableauStyle()
RecupTableau = variable_privee_tableau
End Property
- Initialiser le tableau dans l'événement Initialize de 'MaClasse'
Redim variable_privee_tableau(0) As TableauStyle
- On utilise tout le bousin comme suit
Dim t() As TableauStyle
Dim mc as New MaClasse
t = mc.RecupTableau()
Ceci est un exemple non testé, mais très proche de ce que j'ai fait.
Un dernier conseil cependant. Évite les noms de variables identiques à tes types de données personnalisés.
Ça ne marchera pas avec les modules de classe et c'est de toute façon casse gueule
Marsh Posté le 12-09-2006 à 18:23:11
Merci beaucoup pour ton aide ca semble correspondre à ce que je veux mais j'ai beaucoup de mal pour la mise en pratique =)
Si j'ai bien compris ces deux classes correspondent à l'equivalent du type suivant :
Type TableauStyle
m_Truc as string
End Type
Type MaClasse
variable_privee_tableau() As TableauStyle
End Type
Dim mc as Maclasse
En fait c'est un simple tableau de string a une dimention =)
Si c'était déclaré comme haut dessus :
pour récupérer n_truc dans la troisieme instance de variable_privee_tableau je ferais :
maString = mc.variable_privee_tableau(3).m_Truc
pour modifier n_truc dans la troisieme instance de variable_privee_tableau je ferais :
mc.variable_privee_tableau(3).m_Truc ="test"
Dans ton exemple peux tu détailler la procedure pour faire la meme chose stp ?
J'espère qu'avec ça j'y verrais plus clair =)
Merci encore
A+
Marsh Posté le 13-09-2006 à 12:52:21
Dans mon exemple, t(3).Truc correspond à ce que tu recherches
On doit aussi pouvoir lire directement mc.RecupTableau(3).Truc, je pense mais c'est à vérifier.
Marsh Posté le 13-09-2006 à 15:52:55
Bah justement mc.RecupTableau(3).Truc n'a pas l'air de marcher ...
Donc au lieu de :
mc.variable_privee_tableau(3).m_Truc ="test"
J'ai dorénavant :
t=mc.RecupTableau()
t(3).m_truc = "test"
mc.RecupTableau = t()
si je travaille sur 6 niveaux de sous tableaux comme dans le type que j'ai donné en exemple c'est hyper lourdingue =(
Je crois que je vais rester avec mon bon vieux type ...
Merci quand même
Marsh Posté le 13-09-2006 à 17:06:39
He ho c'est pas parceque je t'ai collé un tableau que c'est la seule méthode à tester !
J'étais resté basique pour montrer un exemple mais regarde du côté des collections. Elles permettent de gérer des éléments indicés.
Ces collections peuvent donc accueillir des objets de type TableauStyle par exemple en gardant le principe des indices (et bien d'autres choses).
Pour ta hiérarchie d'objets ça me semble correct comme solution.
Mais ne crois pas que tu vas faire ça en 2 minutes, ça nécessite un peu de réflexion et de pratique (de l'objet avec VB6 faut pas trop en demander non plus).
Marsh Posté le 10-09-2006 à 21:56:36
Bonjour je dois manipuler des données de la forme suivante :
Ce sont des tableaux qui contiennent des tableaux qui ... en fait c'est pour parser des fichier xml pour les manipuler et dans un second temps pour les rentrer en base de donnée.
Avec ces déclarations ca marche mais ca va m'obliger a écrire une quantité de code monstrueuse et ca me posse quelques soucis quand je veux passer en parametre d'une fonction ou d'un sub une partie de l'arbre. ex :
CurrentVariableValue = nimportequellefonction(Xml(f).Scenario(s).Setvariable(v).value)
Ca me renvois le message d'erreur suivant :
"Seuls les types définis par l'utilisateur et qui sont définis dans des module d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive."
Apres quelques recherches, j'ai cru comprendre que la solution était de passer par des modules de classe. cependant il semble que l'on ne puisse pas avoir une classe comme celle ci :
ex pour une classe "xml" :
Public Named As String
Public Scenario() As Scenario
Public Parent() As Long
Public Child() As Long
J'ai un message d'erreur m'expliqaunt que je ne peux pas déclarer des tableaux en "Public" dans un module de classe.
Le problème c'est que si je le déclare en privé je n'y ai plus acces directement et par voie de conséquence plus acces aux autres tableaux de l'arbre.
Il doit y avoir un truc que j'ai pas compris.
Comment manipuler des données de ce type dans un module de classe ?
merci par avance de votre aide.