PureBasic

Forums PureBasic
Nous sommes le Mer 13/Nov/2019 13:53

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 
Auteur Message
 Sujet du message: Comment améliorer ce code...
MessagePosté: Lun 10/Juin/2019 13:29 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
Salut, comment je pourrais raccourcir ce code ?
Peut être avec une procédure récursive ?

Code:
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:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Lun 10/Juin/2019 13:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Lun 10/Juin/2019 20:33 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
Salut Shadow, c'est le principe du "tree node" :

Code:
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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Lun 10/Juin/2019 21:19 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Lun 10/Juin/2019 21:47 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
Trop pointu ? pourtant le code du haut est relativement simple :

Code:
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 )
Citation:
*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 :
Citation:
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 :

Citation:
; 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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Lun 10/Juin/2019 23:43 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Mar 11/Juin/2019 1:50 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
J'ai essayé:
Code:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Mar 11/Juin/2019 13:34 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 911
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:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Mar 11/Juin/2019 13:47 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comment amélioré ce code...
MessagePosté: Mer 12/Juin/2019 18:02 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
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.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye