Visual Basic - Pointeur vers un objet

santiago69 Messages postés 485 Statut Membre -  
 YAKA -
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

  1. teebo Messages postés 33585 Date d'inscription   Statut Contributeur Dernière intervention   1 797
     
    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...

    .  .
    \_/
    0
    1. santiago69 Messages postés 485 Statut Membre 209
       
      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.
      0
  2. teebo Messages postés 33585 Date d'inscription   Statut Contributeur Dernière intervention   1 797
     
    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

    .  .
    \_/
    0
  3. beldyn Messages postés 189 Statut Membre 19
     
    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,
    0