Comment améliorer ce code...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Comment améliorer ce code...

Message par Shadow »

Salut, comment je pourrais raccourcir ce code ?
Peut être avec une procédure récursive ?

Code : Tout sélectionner

ForEach Gadgets.GadgetInformation(EnfantsGadgetNom$)\NomGadgetsEnfant()
  
  Sub1EnfantsGadgetNom$ = Gadgets.GadgetInformation(EnfantsGadgetNom$)\NomGadgetsEnfant()
  
  Sub1EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\X
  Sub1EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\Y
  Sub1EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\Largeur
  Sub1EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\Hauteur
  Sub1EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\Type
  Sub1EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\Texte
  
  If ListSize(Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
    
  EndIf
  
  ForEach Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\NomGadgetsEnfant()
    
    Sub2EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub1EnfantsGadgetNom$)\NomGadgetsEnfant()
    
    Sub2EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\X
    Sub2EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\Y
    Sub2EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\Largeur
    Sub2EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\Hauteur
    Sub2EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\Type
    Sub2EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\Texte
    
    If ListSize(Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
      
    EndIf
    
    ForEach Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\NomGadgetsEnfant()
      
      Sub3EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub2EnfantsGadgetNom$)\NomGadgetsEnfant()
      
      Sub3EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\X
      Sub3EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\Y
      Sub3EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\Largeur
      Sub3EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\Hauteur
      Sub3EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\Type
      Sub3EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\Texte
      
      If ListSize(Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
        
      EndIf
      
      ForEach Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\NomGadgetsEnfant()
        
        Sub4EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub3EnfantsGadgetNom$)\NomGadgetsEnfant()
        
        Sub4EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\X
        Sub4EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\Y
        Sub4EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\Largeur
        Sub4EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\Hauteur
        Sub4EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\Type
        Sub4EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\Texte
        
        If ListSize(Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
          
        EndIf
        
        ForEach Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\NomGadgetsEnfant()
          
          Sub5EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub4EnfantsGadgetNom$)\NomGadgetsEnfant()
          
          Sub5EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\X
          Sub5EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\Y
          Sub5EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\Largeur
          Sub5EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\Hauteur
          Sub5EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\Type
          Sub5EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\Texte
          
          If ListSize(Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
            
          EndIf
          
          ForEach Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\NomGadgetsEnfant()
            
            Sub6EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub5EnfantsGadgetNom$)\NomGadgetsEnfant()
            
            Sub6EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\X
            Sub6EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\Y
            Sub6EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\Largeur
            Sub6EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\Hauteur
            Sub6EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\Type
            Sub6EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\Texte
            
            If ListSize(Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
              
            EndIf
            
            ForEach Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\NomGadgetsEnfant()
              
              Sub7EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub6EnfantsGadgetNom$)\NomGadgetsEnfant()
              
              Sub7EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\X
              Sub7EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\Y
              Sub7EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\Largeur
              Sub7EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\Hauteur
              Sub7EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\Type
              Sub7EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\Texte
              
              If ListSize(Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                
              EndIf
              
              ForEach Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\NomGadgetsEnfant()
                
                Sub8EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub7EnfantsGadgetNom$)\NomGadgetsEnfant()
                
                Sub8EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\X
                Sub8EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\Y
                Sub8EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\Largeur
                Sub8EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\Hauteur
                Sub8EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\Type
                Sub8EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\Texte
                
                If ListSize(Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                  
                EndIf
                
                ForEach Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\NomGadgetsEnfant()
                  
                  Sub9EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub8EnfantsGadgetNom$)\NomGadgetsEnfant()
                  
                  Sub9EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\X
                  Sub9EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\Y
                  Sub9EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\Largeur
                  Sub9EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\Hauteur
                  Sub9EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\Type
                  Sub9EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\Texte
                  
                  If ListSize(Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                    
                  EndIf
                  
                  ForEach Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\NomGadgetsEnfant()
                    
                    Sub10EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub9EnfantsGadgetNom$)\NomGadgetsEnfant()
                    
                    Sub10EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\X
                    Sub10EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\Y
                    Sub10EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\Largeur
                    Sub10EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\Hauteur
                    Sub10EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\Type
                    Sub10EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\Texte
                    
                    If ListSize(Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                      
                    EndIf
                    
                    ForEach Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\NomGadgetsEnfant()
                      
                      Sub11EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub10EnfantsGadgetNom$)\NomGadgetsEnfant()
                      
                      Sub11EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\X
                      Sub11EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\Y
                      Sub11EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\Largeur
                      Sub11EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\Hauteur
                      Sub11EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\Type
                      Sub11EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\Texte
                      
                      If ListSize(Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                        
                      EndIf
                      
                      ForEach Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\NomGadgetsEnfant()
                        
                        Sub12EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub11EnfantsGadgetNom$)\NomGadgetsEnfant()
                        
                        Sub12EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\X
                        Sub12EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\Y
                        Sub12EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\Largeur
                        Sub12EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\Hauteur
                        Sub12EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\Type
                        Sub12EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\Texte
                        
                        If ListSize(Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                          
                        EndIf
                        
                        ForEach Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\NomGadgetsEnfant()
                          
                          Sub13EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub12EnfantsGadgetNom$)\NomGadgetsEnfant()
                          
                          Sub13EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\X
                          Sub13EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\Y
                          Sub13EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\Largeur
                          Sub13EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\Hauteur
                          Sub13EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\Type
                          Sub13EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\Texte
                          
                          If ListSize(Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                            
                          EndIf
                          
                          ForEach Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\NomGadgetsEnfant()
                            
                            Sub14EnfantsGadgetNom$ = Gadgets.GadgetInformation(Sub13EnfantsGadgetNom$)\NomGadgetsEnfant()
                            
                            Sub14EnfantsGadgetX.i = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\X
                            Sub14EnfantsGadgetY.i = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\Y
                            Sub14EnfantsGadgetLargeur.i = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\Largeur
                            Sub14EnfantsGadgetHauteur.i = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\Hauteur
                            Sub14EnfantsGadgetType$ = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\Type
                            Sub14EnfantsGadgetTexte$ = Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\Texte
                            
                            If ListSize(Gadgets.GadgetInformation(Sub14EnfantsGadgetNom$)\NomGadgetsEnfant()) = 0
                              
                            EndIf
                            
                          Next
                          
                        Next
                        
                      Next
                      
                    Next
                    
                  Next
                  
                Next
                
              Next
              
            Next
            
          Next
          
        Next
        
      Next
      
    Next
    
  Next
  
Next
Cette partie de code dois énuméré tous les gadgets et tous leurs enfants.
En sachant que certain gadget ont des enfants qui eux ont des enfants, etc.

Ex:

Code : Tout sélectionner

Papa

  Enfant 1
    Enfant 1

    Enfant 2
      Enfant 1
      Enfant 2

      Enfant 3
        Enfant 1

        Enfant 2
          Enfant 1
          Enfant 2
          Enfant 3

        Enfant 3

    Enfant 3

  Enfant 2
    Enfant 1
    Enfant 2
    Enfant 3

  Enfant 3

    Enfant 1
      Enfant 1
      Enfant 2
      Enfant 3

    Enfant 2
    Enfant 3
En sachant que ça peut aller loin comme ça !
Je ne sais pas si je suis clair...
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Comment amélioré ce code...

Message par TazNormand »

Salut Shadow,

tu as trouvé ta réponse tout seul : fonction récursive

Et j'ajouterai une liste chainée ou une map pour stocker les résultats de ta fonction récursive

Je n'ai pas le temps ni l'envie de te pondre un bout de code, mais vu comment tu as progressé, tu devrais pouvoir t'en sortir tout seul.
Image
Image
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Comment amélioré ce code...

Message par G-Rom »

Salut Shadow, c'est le principe du "tree node" :

Code : Tout sélectionner

Structure sGadget
  gadgetID.l
  *parent.sGadget
  List *child.sGadget()
  x.l
  y.l
  w.l
  h.l
  type.l
  text$  
EndStructure

Procedure.i CreateGadget(x.l, y.l, w.l, h.l, type.l)
  *g.sGadget = AllocateStructure(sGadget)
  
  ;If type = ...
  ; *g\gadgetID = ButtonGadget(...
  
  *g\parent = #Null 
    
  ProcedureReturn *g
EndProcedure


Procedure DetachGadget(*gadget.sGadget)
  If *gadget\parent <> #Null 
    ForEach *gadget\parent\child()
      If *gadget\parent\child() = *gadget
        DeleteElement( *gadget\parent\child() )
        ProcedureReturn 1
      EndIf 
    Next
  EndIf 
  ProcedureReturn 0
EndProcedure


Procedure AttachGadget(*parent.sGadget, *child.sGadget)
  If *child\parent <> #Null 
    DetachGadget(*child)
  EndIf 
  
  AddElement( *parent\child() ) 
  *parent\child() = *child 
  *child\parent = *parent
EndProcedure


Procedure EnumGadget(*root.sGadget)
  Debug *root\text$
  ForEach *root\child()
    EnumGadget(*root\child())
  Next    
EndProcedure

;//////////////////////////////////////////////////////////////////////////////
;-TEST
;//////////////////////////////////////////////////////////////////////////////
*Racine.sGadget = CreateGadget(0,0,0,0,0)
*Racine\text$ = "Racine"

For i = 0 To 9
  *Enfant.sGadget = CreateGadget(0,0,0,0,0)
  *Enfant\text$ = Chr(9)+"Enfant " + Str(i+1)
  AttachGadget(*Racine, *Enfant)
  For j = 0 To 9
    *SousEnfant.sGadget = CreateGadget(0,0,0,0,0)
    *SousEnfant\text$ = Chr(9)+Chr(9)+"Sous-Enfant " + Str(j+1)
    AttachGadget(*Enfant,*SousEnfant)
  Next
Next 

EnumGadget(*Racine)
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Comment amélioré ce code...

Message par Shadow »

Salut G-Rom,
Merci de ton exemple.

Cependant désolé de te dire que c'est trop pointu pour moi.
Dans mon projet de conversion de code VB vers PB, j'ai une procédure qui énum tous les gadget
tous les enfants de ces gadget, tous les enfants des enfants des gadget, etc.

J'ai des sous niveau très important !
Je te propose de regarder dans mon code à la procédure: AjoutCodeTree()

Il peut énumérer jusque 90 niveau, il ne peut pas au dela car PB ne gère pas plus
de 90 boucle imbriquer des une dans les autres ce qui est déjà pas mal ^^

Bha ça fonctionne mais bon, c'est pas très optimiser comme truc je trouve ^^
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Comment amélioré ce code...

Message par G-Rom »

Trop pointu ? pourtant le code du haut est relativement simple :

Code : Tout sélectionner

Structure sGadget
  gadgetID.l
  *parent.sGadget
  List *child.sGadget()
  x.l
  y.l
  w.l
  h.l
  type.l
  text$  
EndStructure
cette structure represente un gadget , avec certaines propriétés ( x , y , w, h , etc... ) , avec un parent du même type ( sous forme de pointeur )
*parent.sGadget
le parent est donc un autre gadget , ou NULL si pas de parent , dans ce cas, c'est la racine , ou le "papa", comme tu préfères.
ensuite viens une liste de potentiel enfants :
List *child.sGadget()
idem, des pointeurs vers les enfants, rien de bien compliqué.

ensuite via deux petites fonctions , tu peu rajouté ou effacer des liens parent/enfant : AttachGadget() & DetachGadget()

et le code test :
; Creation de la RACINE
*Racine.sGadget = CreateGadget(0,0,0,0,0)
*Racine\text$ = "Racine"

; On ajoute 10 enfants à la racine
For i = 0 To 9
*Enfant.sGadget = CreateGadget(0,0,0,0,0) ; CREATION DE L'ENFANT
*Enfant\text$ = Chr(9)+"Enfant " + Str(i+1)
AttachGadget(*Racine, *Enfant) ; ON L'ATTACHE

; CREATION DES SOUS ENFANTS
For j = 0 To 9
*SousEnfant.sGadget = CreateGadget(0,0,0,0,0)
*SousEnfant\text$ = Chr(9)+Chr(9)+"Sous-Enfant " + Str(j+1)
AttachGadget(*Enfant,*SousEnfant) ; ON ATTACHE
Next
Next

; FONCTION DEBUG QUI ENUMERE LA RACINE OU N'IMPORTE QUEL NOEUD
EnumGadget(*Racine)
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Comment amélioré ce code...

Message par Shadow »

C'est que j'ai jamais encore fais ce genre de code...
Avec les pointeurs.

Mais j'imagine que c'est comme faire par exemple:

NewList MaListe.MaStructure()

MaListe() pointe sur MaStructure .
Donc si je fais:

*MaVariable.MaStructure, c'est un peu pareil j'imagine...
Mais est ce que ça résout mon problème ton code, je ne crois pas non !

Il va là aussi falloir que je face 90 niveau de boucle ForEach !
Pour lister tous les parents des gosses des gosses des gosses, etc.

Déjà que je rame avec mon code alors si je m’emmêle avec les pointeurs et tout ça ^^
J'imaginais un truc récursif...

C'est pas grave, ça fonctionne mais mon code n'est pas optimisé !
Merci.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Comment amélioré ce code...

Message par Shadow »

J'ai essayé:

Code : Tout sélectionner

Procedure A(NomGadgetParent$)
  
  ForEach Gadgets.GadgetInformation(NomGadgetParent$)\NomGadgetsEnfant()
    
    Noeux.i + 1
    NomGadgetEnfant$ = Gadgets.GadgetInformation(NomGadgetParent$)\NomGadgetsEnfant()

    If NomGadgetEnfant$ <> ""
      
      AddElement(NomGadgetsReorganiserVB.s())
      NomGadgetsReorganiserVB.s() = NomGadgetEnfant$
      
      AddGadgetItem(#TreeGadget, -1, NomGadgetEnfant$, 0, Noeux.i)
      
      AddGadgetItem(#TreeGadget, -1, "X: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Str(Gadgets.GadgetInformation(NomGadgetEnfant$)\X.i), 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Y: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Str(Gadgets.GadgetInformation(NomGadgetEnfant$)\Y.i), 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Largeur: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Str(Gadgets.GadgetInformation(NomGadgetEnfant$)\Largeur.i), 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Hauteur: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Str(Gadgets.GadgetInformation(NomGadgetEnfant$)\Hauteur.i), 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Type: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Gadgets.GadgetInformation(NomGadgetEnfant$)\Type, 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Texte: ", 0, Noeux.i + 1)
      AddGadgetItem(#TreeGadget, -1, Gadgets.GadgetInformation(NomGadgetEnfant$)\Texte, 0, Noeux.i + 2)
      
      AddGadgetItem(#TreeGadget, -1, "Enfants: ", 0, Noeux.i + 1)
      
      If ListSize(Gadgets.GadgetInformation(NomGadgetEnfant$)\NomGadgetsEnfant()) = 0
        AddGadgetItem(#TreeGadget, -1, "Aucun", 0, Noeux.i + 2)
      EndIf
      
      Noeux.i + 1
      A(NomGadgetEnfant$)
      
    Else
      Break
      
    EndIf
    
  Next
  
EndProcedure
Ont dirais que ça fonctionne mais pas contre les ajous dans le tree ne sont pas bon.
J'ai une question:

Quand je refais appel à la procédure, il y à une espèce de pile qui se créer non ?
Alors est ce que le résultat de "Noeux.i" est conserver pour cette session de la boucle ?
Quand il à fini une boucle, qu'il reviens à la précédente, la valeur de "Noeux.i" au moment de l'appel à été conserver ?

Car ça coince à ce niveau là ont dirais.
De plus c'est extrêmement lent comme procéder, largement bien plus que avec les boucles imbriqué !

Que faire ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Comment amélioré ce code...

Message par Mesa »

Le code de GROM est le plus propre mais tu peux utiliser la bidouille qui consiste à utiliser l'arbre d'un treegadget.
Ce n'est pas très pratique mais ça peut suffire.
Tu n'es pas obligé d'afficher le gadget en utilisant HideGadget(#Gadget, Etat) et tu peux utiliser les fonctions du gadget pour remplir ou modifier l'arbre.
- AddGadgetItem() : Ajoute un élément, et éventuellement une icône
- RemoveGadgetItem() : Efface un élément (et ses sous-éléments)
- ClearGadgetItems() : Supprime tous les éléments
- CountGadgetItems() : Renvoie le nombre d'éléments actuellement contenus dans le gadget.
Par contre je ne connais pas les limites du gadget.

Code : Tout sélectionner

DataSection
  DonneesTexte:
  Data.l 25      
  Data.s "0Papa"
  
  Data.s "1Enfant1"
  
  Data.s "2Enfant1"
  
  Data.s "3Enfant1"
  
  Data.s "4Enfant1"
  Data.s "4Enfant2"
  Data.s "4Enfant3"
  
  Data.s "5Enfant1" 
  Data.s "5Enfant2"
  Data.s "6Enfant1"
  Data.s "6Enfant2"
  Data.s "6Enfant3"
  
  Data.s "5Enfant3"
  
  Data.s "3Enfant2"
  Data.s "4Enfant1"
  Data.s "4Enfant2"
  Data.s "4Enfant3"
  Data.s "3Enfant2"
  Data.s "3Enfant3"
  
  Data.s "2Enfant2"
  Data.s "3Enfant1"
  Data.s "3Enfant2"
  Data.s "3Enfant3"
  
  Data.s "1Enfant2"
  Data.s "1Enfant3"
  ; Data.s "end"
EndDataSection


Structure Struct_Enfant
  nom$
  niveau.l
EndStructure

Global NewList Enfant.Struct_Enfant()

;Remplissage de la liste
Restore DonneesTexte
Read n
Debug n

For i=1 To n
  Read.s ok$
  ok$=Trim(ok$)
  ;astuce: le  nombre détermine le niveau
  niveau=Val(Trim(Left(ok$,1)))
  AddElement(Enfant())
  Enfant()\nom$=Right(ok$,Len(ok$)-1)
  Enfant()\niveau=niveau
  Debug Right(ok$,Len(ok$)-1)
  Debug niveau
Next i

If OpenWindow(0, 0, 0,320, 520, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  TreeGadget(0,10,10,300, 400) 
  
  
  ;remplissage du treegadget
  ForEach Enfant()
    AddGadgetItem(0, -1, Enfant()\nom$, 0, Enfant()\niveau)
  Next
  
  ; ajout d'un enfant après coup
  AddGadgetItem(0, -1, "Enfant4", 0, 1) ; ici, il faudait mettre à jour la liste Enfant()
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf





M.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Comment amélioré ce code...

Message par Shadow »

Merci Mesa.

Pour mon problème, le Noeux n'est pas conservé, d'ou les soucis, je cherche une solution...
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Comment amélioré ce code...

Message par G-Rom »

Je comprend pas ton problème de "conservation" de noeud.
je t'ai donner un exemple qui marche, avec hiérarchie parent/enfant.

A toi de faire une seule liste de "sGadget" ( par rapport à mon code ) , et tu auras accès à tout tes noeuds, et les infos qui vont avec... là, tu te fait des noeuds au cerveau pour rien.
si tu as des lacunes avec les pointeurs, je pense qu'il y a tout ce qu'il faut sur le forum pour cela.
Répondre