[Tuto]Les TreeGadget() (PB 4.02)

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

[Tuto]Les TreeGadget() (PB 4.02)

Message par Chris »

Un petit tuto à la portée des débutants pour l'utilisation des TreeGadget().

Version de PB : 4.02

But du tuto : Expliquer comment utiliser un TreeGadget pour y afficher les fichiers contenus dans un répertoire, comment récupérer le nom de ces fichiers pour les utiliser, et accessoirement, comment explorer les dossiers qui sont contenus dans le répertoire grace à une procédure récursive.

(Ca te va, ça, Dobro, comme intro?) :lol:

Code : Tout sélectionner

;{- Enumération des Constantes
Enumeration
  #Win_Main
EndEnumeration
Enumeration
  #Tree
  #Str_Chemin
EndEnumeration
;}

;{- Constantes diverses
#ImgFold = 0
#ImgFile = 1
;}

;{- Structures, Listes et Tableaux
;/ La liste chainée, couplée à une structure, permet de récupérer plusieurs des caractéristiques
;/ concernant les fichiers. 
Structure Fichiers
  NomFichier.s                        ; Nom du fichier ou du dossier
  Chemin.s                            ; Chemin complet
  Niveau.l                            ; Niveau ou se situe le fichier dans l'arborescence
  Type.b                              ; Type d'élément : Dossier (0) ou Fichier (1)
EndStructure
Global NewList Arbre.Fichiers()
;}

;{- Images du TreeGadget
;/ Création de deux images toutes simples pour différencier les fichiers des dossiers.
;/ On peut, évidemment, charger des images ou des icônes à la place.
If CreateImage(#ImgFile, 16, 16)
  StartDrawing(ImageOutput(#ImgFile))
  Box(0, 0, 16, 16, $FFFFFF)
  DrawText(3,0,"F", $0000FF)
  StopDrawing()
EndIf

If CreateImage(#ImgFold, 16, 16)
  StartDrawing(ImageOutput(#ImgFold))
  Box(0, 0, 16, 16, $FFFFFF)
  DrawText(3,0,"D", $FF0000)
  StopDrawing()
EndIf
;}

;{- Procédures
Procedure.s ListFiles(Directory.s, Nb.l, Ext.s)
  ;/ On explore tout les dossiers contenus dans le chemin fourni à la procédure.
  
  ; Vérification de la présence de la barre oblique à la fin du chemin.
  ; Si elle n'y est pas, on l'ajoute.
  If Right(Directory, 1) <> "\" : Directory + "\" : EndIf
  
  
  If ExamineDirectory(Nb, Directory, "*.*")
    While NextDirectoryEntry(Nb)
      If DirectoryEntryName(Nb) <> "." And DirectoryEntryName(Nb) <> ".."
        
        If DirectoryEntryType(Nb) = #PB_DirectoryEntry_File And GetExtensionPart(DirectoryEntryName(Nb)) = Ext
          
          ; ------------ Les fichiers ------------
          AddElement(Arbre())
          Arbre()\NomFichier = DirectoryEntryName(Nb)
          Arbre()\Chemin = Directory+DirectoryEntryName(Nb)
          Arbre()\Niveau = Nb
          Arbre()\Type = 1
          ; ------------ ************ ------------
          
        EndIf
        If DirectoryEntryType(Nb) = #PB_DirectoryEntry_Directory
          
          ; ------------ Les dossiers ------------ 
          AddElement(Arbre())
          Arbre()\NomFichier = DirectoryEntryName(Nb)
          Arbre()\Chemin = Directory + DirectoryEntryName(Nb)
          Arbre()\Niveau = Nb
          Arbre()\Type = 0
          
          ; ------------ ************ ------------
          
          ListFiles(Directory + DirectoryEntryName(Nb), Nb + 1, Ext)
        EndIf
      EndIf
    Wend
    FinishDirectory(Nb)
  EndIf
  
EndProcedure
;}

;{- Initialisation
;/ Ouverture de la fenêtre et création des gadgets
If OpenWindow(#Win_Main, 0, 0, 400, 425, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Win_Main))
    TreeGadget(#Tree, 5, 5, 390, 390)
    StringGadget(#Str_Chemin, 5, 400, 390, 20, "")
  EndIf
EndIf

;/ Récupération des fichiers
Repertoire$ = "D:\PureBasic4\CodeArchiv"  ; Modifier le répertoire
Extension$  = "pb"                        ; Modifier l'extension

ListFiles(Repertoire$, 0, Extension$) 

;/ Affichage des fichiers dans le TreeGadget
ForEach Arbre()
  If Arbre()\Type = 0
    AddGadgetItem(#Tree, -1, Arbre()\NomFichier, ImageID(#ImgFold), Arbre()\Niveau)
  Else
    AddGadgetItem(#Tree, -1, Arbre()\NomFichier, ImageID(#ImgFile), Arbre()\Niveau)
  EndIf
Next
;}

;{- Boucle
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Tree
          
          ;/ Quand on clique sur un dossier ou un fichier...
          If EventType() = #PB_EventType_Change
            
            ;/ ...on parcours la liste chainée à la recherche du nom relevé dans le TreeGadget.
            ForEach Arbre()
              If GetGadgetItemText(#Tree, GetGadgetState(#Tree),0) = Arbre()\NomFichier
                
                ;/ On a trouvé le nom, on sélectionne l'élément et on sort
                SelectElement(Arbre(), ListIndex(Arbre())) : Break
              EndIf
            Next
            
            ;/ Et on utilise le nom trouvé pour faire ce qu'on a à faire.
            ;/ (ici, on affiche le nom dans un StringGadget)
            SetGadgetText(#Str_Chemin, Arbre()\Chemin)
            
          EndIf
      EndSelect
      
    Case #PB_Event_CloseWindow
      Quit = #True
  EndSelect
Until Quit
End
;}
Dernière modification par Chris le sam. 18/août/2007 2:47, modifié 1 fois.
Anonyme

Message par Anonyme »

Cool le code :D
Dernière modification par Anonyme le ven. 17/août/2007 23:04, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Cpl.Bator a écrit :Cool le code :D
Cool! Faut rien exagérer non plus. :lol:
Répondre