Visual Basic - Pointeur vers un objet
santiago69
Messages postés
477
Date d'inscription
Statut
Membre
Dernière intervention
-
YAKA -
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.
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.
A voir également:
- Visual Basic - Pointeur vers un objet
- Visual basic - Télécharger - Langages
- Visual basic editor - Télécharger - Langages
- Visual petanque - Télécharger - Sport
- Microsoft 365 basic - Accueil - Microsoft Office
- Visual c++ 2019 - Guide
4 réponses
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...
. .
\_/
Pour faire un module de classe neamoins tu peux juste cliquer avec le bouton droit sur ton projet et faire new/class module...
. .
\_/
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
. .
\_/
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
. .
\_/
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,
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,
Peut etre devrais tu explorer l'article que j'ai écris sur ce site:
http://www.c2i.fr/code.asp?IDCode=1093&type=2&IDCate=11&Cate=Classes
Il presente une certaine facon de faire des collections de collections de collections de .... classes.
Je n'ai pas le temps de regarder en profondeur (des que je peux je ferai) mais mon article devrais au te donner des idees.
A+
http://www.c2i.fr/code.asp?IDCode=1093&type=2&IDCate=11&Cate=Classes
Il presente une certaine facon de faire des collections de collections de collections de .... classes.
Je n'ai pas le temps de regarder en profondeur (des que je peux je ferai) mais mon article devrais au te donner des idees.
A+
Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.