besoin d'aide sur les module de classe

besoin d'aide sur les module de classe - VB/VBA/VBS - Programmation

Marsh Posté le 10-09-2006 à 21:56:36    

Bonjour je dois manipuler des données de la forme suivante :
 

Code :
  1. Type Index
  2.     Order() As Long
  3.     Type() As String
  4.     Id() As String
  5.     Number As Long
  6. End Type
  7. Type Line
  8.     Texte As String
  9. End Type
  10. Type Action
  11.     Line As Line
  12. End Type
  13. Type Obsrvt
  14.     Line As Line
  15. End Type
  16. Type Step
  17.     Index As Index
  18.     Action() As Action
  19.     Obsrvt() As Obsrvt
  20. End Type
  21. Type Setvariable
  22.     Variable As String
  23.     Value As String
  24.     Memory As String
  25. End Type
  26. Type Procedure
  27.     Named As String
  28.     Title As String
  29.     GP As String
  30.     Index As Index
  31.     Setv() As Setv
  32.     Step() As Step
  33. End Type
  34. Type Process
  35.     Named As String
  36.     Path As String
  37. End Type
  38. Type Scenario
  39.     Named As String
  40.     Index As Index
  41.     Include() As String
  42.     Process() As Process
  43.     Comment() As String
  44.     Setvariable() As Setvariable
  45.     Procedure() As Procedure
  46. End Type
  47. Type File
  48.     Named As String
  49.     Scenario() As Scenario
  50.     Parent() As Long
  51.     Child() As Long
  52. End Type
  53. Global Xml() As File


 
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.

Reply

Marsh Posté le 10-09-2006 à 21:56:36   

Reply

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
toto = Xml(f).Scenario(s).Setvariable(v).value
CurrentVariableValue = nimportequellefonction(toto)


Reply

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 ...

Reply

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

Reply

Marsh Posté le 12-09-2006 à 18:23:11    

:jap: 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+


Message édité par fifiz le 12-09-2006 à 21:40:42
Reply

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.

Reply

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

Reply

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).
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed