Tu peut jouer avec une procédure dite abstraite, ce qui revient à dire que chacun de tes niveaux appellera la procédure adéquate que tu renseigne à sa création
Code : Tout sélectionner
Prototype abstract(*this)
; Tous les gadgets sont des _content
Structure _content
abstract.abstract ; procédure qui sera appellée en fonction du type
List *myContents._content()
EndStructure
Structure _gad_1 Extends _content
name.s
;etc
EndStructure
Structure _gad_2 Extends _content
name.s
;etc
EndStructure
Structure _gad_3 Extends _content
name.s
;etc
EndStructure
Global NewList *myGadget._content()
; procédure abstraite pour le gadget 1
Procedure make_gadget_1(*g._gad_1)
Debug "MAKE GADGET 1 "+*g\name
ForEach *g\myContents()
*g\myContents()\abstract(*g\myContents())
Next
EndProcedure
; procédure abstraite pour le gadget 2
Procedure make_gadget_2(*g._gad_2)
Debug "MAKE GADGET 2 "+*g\name
ForEach *g\myContents()
*g\myContents()\abstract(*g\myContents())
Next
EndProcedure
; procédure abstraite pour le gadget 3
Procedure make_gadget_3(*g._gad_3)
Debug "MAKE GADGET 3 "+*g\name
ForEach *g\myContents()
*g\myContents()\abstract(*g\myContents())
Next
EndProcedure
; ajoute un gadget de type 1
Procedure newGadget_1(name.s)
AddElement(*myGadget())
*myGadget() = AllocateStructure(_gad_1)
*g._gad_1 = *myGadget()
With *g
\name = name
\abstract = @make_gadget_1()
EndWith
ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 2
Procedure newGadget_2(name.s)
AddElement(*myGadget())
*myGadget() = AllocateStructure(_gad_2)
*g._gad_2 = *myGadget()
With *g
\name = name
\abstract = @make_gadget_2()
EndWith
ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 3
Procedure newGadget_3(name.s)
AddElement(*myGadget())
*myGadget() = AllocateStructure(_gad_3)
*g._gad_3 = *myGadget()
With *g
\name = name
\abstract = @make_gadget_3()
EndWith
ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 1
Procedure addChidGadget_1(*parent._content,name.s)
AddElement(*parent\myContents())
*parent\myContents() = AllocateStructure(_gad_1)
*g._gad_1 = *parent\myContents()
With *g
\name = name
\abstract = @make_gadget_1()
EndWith
ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_2(*parent._content,name.s)
AddElement(*parent\myContents())
*parent\myContents() = AllocateStructure(_gad_2)
*g._gad_2 = *parent\myContents()
With *g
\name = name
\abstract = @make_gadget_2()
EndWith
ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_3(*parent._content,name.s)
AddElement(*parent\myContents())
*parent\myContents() = AllocateStructure(_gad_3)
*g._gad_3 = *parent\myContents()
With *g
\name = name
\abstract = @make_gadget_3()
EndWith
ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; on ajoute au hasard des items
; j'ajoute un premier élement
Define *g = newGadget_1("ITEM 1")
; un enfant à l'item 1
addChidGadget_2(*g,"item 1 B")
; un enfant à l'item 1
Define *g = addChidGadget_3(*g,"item 1 C")
; un sous enfant à l'item 1 C
addChidGadget_2(*g,"item 1 C A")
; un sous enfant à l'item 1 C
Define *g = addChidGadget_1(*g,"item C B")
; un sous sous enfant à l'item 1 C B
addChidGadget_2(*g,"item 1 C B A")
; un second item
newGadget_2("ITEM 2")
; maintenant on teste un seule boucle est nécessaire
; les procédures abstraites font le reste du travail
ForEach *myGadget()
*myGadget()\abstract(*myGadget())
Next