Visual Basic - Pointeur vers un objet

Bonjour,

Je cherche a construire une arbre a profondeur variable.

Le type de base est le suivant :
Type BoxTree
Index as long 'Valeur du noeud
Count as long 'Nombre de fils
List() 'Liste des fils
End Type

Si Obj est de type BoxTree, je voudrais pouvoir placer dans Obj.List(i) de nouveaux objets de type BoxTree.
Me suis je bien fait comprendre, l'arbre est compose de noeud qui ont chacun une valeur et un tableau de noeuds fils.

Probleme : d'une part, je ne peux pas definir explicitement List() comme contenant des objets BoxTree car il y aurait une reference circulaire dans le type BoxTree ; d'autre part, si je garde un type variant, et que j'essaie d'inserer un objet BoxTree dans List(i) j'obtient une erreur de compilation.

Le code est le suivant : On suppose que Pere est un noeud de valeur 123, il a deja n fils ; on va lui ajouter un fils qui va prendre pour valeur le noeud appele Fils de valeur 456.

Sub TestBoxTree()

Dim Pere as BoxTree
Pere.Index = 123
Dim Fils as BoxTree
Fils.Index = 456

Pere.Count = Pere.Count + 1
ReDim Preserve Pere.List(1 to Pere.Count)
Pere.List(Pere.Count) = Fils

End Sub

L'erreur se situe a la derniere ligne et le message est le suivant : Seuls les types definis par l'utilisateur et qui sont

definis dans les modules d'objets publics peuvent etre convertis depuis ou vers un variant, ou passes a des fonctions a liaison tardive

Il semble que la solution consiste a definir le type BoxTree dans un module de classe... Mais voila, je ne sais ni ne trouve comment faire un module de classe.

Merci a tous ceux qui pourraient m'aider.

Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Mmmm, j'ai peur que ce que tu demandes a VB6 depasse ses competences...
    Pour faire un module de classe neamoins tu peux juste cliquer avec le bouton droit sur ton projet et faire new/class module...

    .  .
    \_/
    1. Certes, je suis capable de creer un module de classe, mais comment dois-je le remplir pour creer les instances, les proprietes et les methodes des objets ?

      Il y a 10 types de personnes dans le monde
      Ceux qui comprennent le binaire et les autres.
  2. Contributeur
    Ben "normalement":

    Private m_lGeneralFlags As Long
    Public m_strGUID As String

    Private Sub Class_Initialize()
    On Error Resume Next
    'Constructeur
    End Sub

    Private Sub Class_Terminate()
    On Error Resume Next
    'Destructeur
    End Sub

    Public Function Alpha( ) As Object
    Set Alpha = Nothing
    'Blabla....
    End Function

    .  .
    \_/
    1. Salut,
      Voici un autre exemple:

      Private Sub Class_Initialize()
      On Error GoTo Erreur
      Set WFind = New Word.Application
      CompteurErreur = 0
      Exit Sub
      Erreur:
      Alerte "L'initialisation de l'objet Word a échouée", "ZWordFind", vbCritical
      MsgBox "L'applcation va se terminer", vbOKOnly, "ZWordFind"
      End
      End Sub

      Private Sub Class_Terminate()
      On Error GoTo Erreur
      WFind.Visible = True
      WFind.Quit
      Set WFind = Nothing
      Exit Sub
      Erreur:
      If Err.Number = 462 Then
      Resume Next
      Else
      AlerteC "Class_Terminate", "ZWordFind", vbCritical
      End If
      End
      End Sub

      'Pour les propriété:
      'recupération de la valeur
      Public Property Get LibelleOrdinateur() As String

      'affectation de valeur
      Public Property Let SetParent(Fenetre As Long)

      'exemple:
      Private CaptionOrdinateur As String
      Private CaptionRepertoire As String

      Public Property Let LibelleOrdinateur(Nom As String)
      CaptionOrdinateur = Nom
      End Property

      Public Property Get LibelleOrdinateur() As String
      LibelleOrdinateur = CaptionOrdinateur
      End Property

      Public Property Let LibelleRepertoire(Nom As String)
      CaptionRepertoire = Nom
      End Property

      Public Property Get LibelleRepertoire() As String
      LibelleRepertoire = CaptionRepertoire
      End Property

      Voilà, j'espere que ce t'aidera. Autre chose, plutot que le type variant, tu peux aussi utiliser le type Object.
      A++

      Beldyn,