Collection de classe récursive : Méthode Remove

dionys0s

XLDnaute Impliqué
Bonjour le forum,

j'ai mis au point un objet collection de classe que je qualifie (peut-être à tort) de récursif, puisqu'il peut se contenir lui même (comme une poupée russe) ce qui permet de créer un arbre en gros.

J'arrive à l'alimenter, mais je n'arrive pas à créer la méthode Remove... Je sèche complètement, ça fait des heure que je suis dessus sans succès. S'il ne s'agissait pas d'une classe récursive, ça serait tout simple, mais là je lutte.

Si quelqu'un a déjà fait ça ou a une idée, je suis preneur. D'avance merci pour votre aide :) Je continue de chercher quand même...
 

Pièces jointes

  • Classe recursive.xlsm
    975.6 KB · Affichages: 59

Dranreb

XLDnaute Barbatruc
Bonsoir.
Pourquoi ceci ne conviendrait pas ?
VB:
Public Sub Remove(Code As String)
On Error Resume Next
mColl.Remove Code
End Sub
Notez que je n'ai pas encore bien compris ce que votre classe avait de récursif, ni pourquoi la Property Get Item admettait un cRecurObjs différent de celui dont on invoque la propriété.

Votre image de poupées russes me fait penser à ma fonction GroupOrg qui renvoie une collection d'objets SsGroup, lesquels possèdent une propriété Id As Variant et une autre Contenu As Collection, cette dernière pouvant à son tour contenir des SsGroup.
Mais c'est seulement un outils pour établir des rapports plus personnalisés que les TCD. Je n'ai pas prévu la possibilité de supprimer un élément et l'Id n'est pas une clé dans la collection qui le contient. C'est plutôt fait pour être parcouru séquentiellement, mais à différents niveaux Entêtes/Détail/Totaux imbriqués.
 

dionys0s

XLDnaute Impliqué
Re,
bonjour Dranreb,

En gros, j'ai une classe "cFamilly", qui est une collection de ma classe "cChild", laquelle contient également une collection "cFamilly" :
VB:
Option Explicit

Public Code As String, Index As Long, Parent As String, Familly As New cFamilly

Une fois la peuplée, ma classe est une famille dont chaque enfant possède (potentiellement) une famille dont chaque enfant possède (potentiellement) une famile, etc... (d'où mon emploi peut-être abusif de récursif).

Pour parcourir tout ça, il suffit donc de
VB:
  Dim Child As cChild

  For Each Child In Familly
    'du code ici
    LoopThroughFamilly Child.Familly
    'du code ici
  Next Child¨
Mais en gros dans mon exemple, j'ai une famille dont l'arborescence est :

CODE 1 (Enfant de la l'objet "le plus haut placé" ; frère de CODE 2 ; parent de CODE 1.1 et CODE 1.2)
---- CODE 1.1
-------- CODE 1.1.1
-------- CODE 1.1.2
---- CODE 1.2
-------- CODE 1.2.1
-------- CODE 1.2.2
CODE 2
---- CODE 2.1
-------- CODE 2.1.1
-------- CODE 2.1.2
---- CODE 2.2
-------- CODE 2.2.1
-------- CODE 2.2.2

Et j'aimerais créer la méthode Remove qui supprimerait n'importe-quelle branche de mon choix.
J'ai modifié la PJ du post #1 pour que les noms de classes soient plus explicites. Et puis je l'ajoute à ce post on ne sait jamais.

Merci d'avance pour votre temps et votre aide :)
 

Pièces jointes

  • Classe recursive.xlsm
    975.6 KB · Affichages: 69

Dranreb

XLDnaute Barbatruc
Je n'ai que deux remarques à faire
1) — Je ne vois guère ce qu'apporte exactement la classe Family, à part une complexité peu utile. Collection devrait suffire.
2) — La propriété Parent de Child devrait être un objet, pas un String. Family ou donc plutôt Collection. Ça devrait permettre de lui écrire une méthode Delete qui ferait Parent.Remove Code
 

dionys0s

XLDnaute Impliqué
Re,

1 - Comment fait-on pour faire une collection de classe autrement ?
2 - Si le parent est objet, je fais un Set Item.Parent = Me(Parent), mais alors le parent contient le fils qui contient le parent qui contient le fils etc... puisque c'est un pointeur. L'objet est "infini" et la libération de la mémoire peut prendre un temps fou.
 

Dranreb

XLDnaute Barbatruc
Je pense que j'écrirais un seul module de classe appelé NamedCollection programmé comme suit en premier jet, sans les détections d'erreurs à venir :
VB:
Option Explicit

Public Name As String, Parent As NamedCollection, Index As Long, Content As Collection

Public Function Add(ByVal Name As String, Optional ByVal Item As Variant) As NamedCollection
If IsMissing(Item) Then Set Item = New NamedCollection
If Content Is Nothing Then Set Content = New Collection
Content.Add Item, Name
If TypeOf Item Is NamedCollection Then
  Set Add = Item
  Add.Name = Name
  Set Add.Parent = Me
  Add.Index = Me.Content.Count
  If Add.Content Is Nothing Then Set Add.Content = New Collection
  End If
End Function

Public Function Item(ByVal Name As String)
On Error Resume Next
If IsObject(Content(Name)) Then Set Item = Content(Name) Else Item = Content(Name)
End Function

Public Sub Delete(Optional ByVal Name As String = "*")
If Name = "*" Then
  Parent.Content.Remove Me.Name
  Me.Name = "": Index = 0: Set Parent = Nothing
Else
  Content.Remove Name
  End If
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 799
Messages
2 092 241
Membres
105 305
dernier inscrit
Momone59