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?)

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
;}