
Voilà j'aurais besoins d'un ExplorerTreeGadget mais ouvert que sur un répertoire, comme lorsque l'on execute cela :
Code : Tout sélectionner
RunProgram( "C:\WINNT\explorer.exe" , "/n,/e,/root,c:\Program Files\" , "" ,#PB_Program_Wait)
Code : Tout sélectionner
RunProgram( "C:\WINNT\explorer.exe" , "/n,/e,/root,c:\Program Files\" , "" ,#PB_Program_Wait)
Structure Directory
Type.s
name.s
EndStructure
Global NewList File.Directory()
OpenWindow(0,50,50,600,400," ExplorerTreeGadget (1 seul répertoire")
CreateGadgetList(WindowID(0))
TreeGadget(0,10,10,300,250)
Procedure Analyse_Directory()
Directory$ = "C:\" ; Choisir le répertoire à examiner
If ExamineDirectory(0,Directory$,"*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
AddElement(File())
File()\Type = " [Fichier] "
File()\name = DirectoryEntryName(0)
Else
AddElement(File())
File()\Type = " [Sous-répertoire] "
File()\name = DirectoryEntryName(0)
EndIf
;Debug DirectoryEntryName(0) + Type$ + "- Taille en octet : " + Str(DirectoryEntrySize(0))
Wend
FinishDirectory(0)
EndIf
EndProcedure
Procedure AddNewElement()
ForEach File()
AddGadgetItem(0,-1,File()\name+File()\Type)
Next
EndProcedure
Analyse_Directory()
AddNewElement()
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
End
Code : Tout sélectionner
Enumeration
#winex
#TreeExplorer
#Statusbar
EndEnumeration
Procedure.l ExtractSmallIconFile(IconPath.s) ; 16*16
; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath
SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
ProcedureReturn InfosFile\hIcon
EndProcedure
Structure InfoFichier
NomElement.s
Type.l
EndStructure
Global NewList RechercheFichier.InfoFichier()
Global DossierRecherche.s
Procedure AnalyseDossier(Num, dossier.s)
If Right(dossier, 1) <> "\" : dossier + "\" : EndIf
Dossier2.s = RemoveString(dossier, DossierRecherche)
Dossier3.s = ReplaceString(Left(Dossier2, Len(Dossier2) - 1), "\", "\?1?")
If Dossier3
Dossier3 = "?1?" + Dossier3 + "\"
EndIf
files.l = 0
folders.l = 0
If ExamineDirectory(Num, dossier, "*.*")
While NextDirectoryEntry(Num)
If DirectoryEntryType(Num) = #PB_DirectoryEntry_File
name.s = DirectoryEntryName(Num)
AddElement(RechercheFichier())
RechercheFichier()\NomElement = Dossier3 + "?2?" + name
RechercheFichier()\Type = 1
ElseIf DirectoryEntryType(Num) = #PB_DirectoryEntry_Directory
name.s = DirectoryEntryName(Num)
If name <> "." And name <> ".."
AddElement(RechercheFichier())
RechercheFichier()\NomElement = Dossier3 + "?1?" + name
RechercheFichier()\Type = 2
AnalyseDossier(Num + 1, dossier + name)
EndIf
EndIf
Wend
FinishDirectory(Num)
EndIf
EndProcedure
Procedure ExplorerDossier(ValTh.l)
dossier.s = "C:\" ;<<< A MODIFIER SELON TEMPS DISPO
If Right(dossier, 1) <> "\" : dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier
ClearGadgetItemList(#TreeExplorer) ;nettoyage du précédent arbre (mise à jour)
ClearList(RechercheFichier()) ;nettoyage de la liste
DossierRecherche = dossier
AnalyseDossier(0, dossier)
SortStructuredList(RechercheFichier(), 2, 0, #PB_Sort_String)
; On retire les ?1? et ?2?, et également l'adresse du dossier d'origine
ForEach RechercheFichier()
RechercheFichier()\NomElement = RemoveString(RemoveString(RechercheFichier()\NomElement, "?1?"), "?2?")
Next
; On rempli l'arbre avec les noms de fichiers
Nb_Dossier = 0
n = 0
ForEach RechercheFichier()
Temp = CountString(RechercheFichier()\NomElement, "\")
If Temp < Nb_Dossier ; Temp va être notre référence de niveau dans l'arbre
Nb_Dossier - 1
icone.l = ExtractSmallIconFile(dossier+RechercheFichier()\NomElement) ; c'est mieux ainsi
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,icone,Temp)
ElseIf Temp > Nb_Dossier
Nb_Dossier + 1
icone.l= ExtractSmallIconFile(dossier+RechercheFichier()\NomElement)
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,icone,Temp)
Else
icone.l = ExtractSmallIconFile(dossier+RechercheFichier()\NomElement)
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,icone,Temp)
EndIf
n + 1
StatusBarText(#Statusbar, 0, "Listing total : "+Str(CountGadgetItems(#TreeExplorer))+" Patientez durant l'analyse...")
Next
StatusBarText(#Statusbar, 0, "Listing total : "+Str(CountGadgetItems(#TreeExplorer))+" - Analyse terminée.")
EndProcedure
If OpenWindow(#winex,50,50,600,400," ExplorerTreeGadget (1 seul répertoire)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#winex))
TreeGadget(#TreeExplorer,10,10,580,360)
If CreateStatusBar(#Statusbar, WindowID(#winex))
AddStatusBarField(600)
StatusBarText(#Statusbar, 0, "", #PB_StatusBar_Raised)
EndIf
EndIf
CreateThread(@ExplorerDossier(),0) ; permet le refresh sans figer la fenêtre
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
End
...mais encore?? Qu'est-ce qui ne marche pas chez toi?Stefou a écrit :Ton code ne marche pas chez moi
Code : Tout sélectionner
;Cocher "Executable Thread safe" dans les options de compilation
Enumeration
#winex
#TreeExplorer
#STATUSBAR
EndEnumeration
;Procedure.l ExtractSmallIconFile(IconPath.s) ; 16*16
; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath
;SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
;ProcedureReturn InfosFile\hIcon
;EndProcedure
Structure InfoFichier
NomElement.s
Type.l
EndStructure
Global NewList RechercheFichier.InfoFichier()
Global DossierRecherche.s
Global ThreadScan.l
Procedure AnalyseDossier(Num, dossier.s)
If Right(dossier, 1) <> "\" : dossier + "\" : EndIf
Dossier2.s = RemoveString(dossier, DossierRecherche)
Dossier3.s = ReplaceString(Left(Dossier2, Len(Dossier2) - 1), "\", "\?1?")
If Dossier3
Dossier3 = "?1?" + Dossier3 + "\"
EndIf
files.l = 0
folders.l = 0
If ExamineDirectory(Num, dossier, "*.*")
While NextDirectoryEntry(Num)
If DirectoryEntryType(Num) = #PB_DirectoryEntry_File
Name.s = DirectoryEntryName(Num)
AddElement(RechercheFichier())
RechercheFichier()\NomElement = Dossier3 + "?2?" + Name
RechercheFichier()\Type = 1
ElseIf DirectoryEntryType(Num) = #PB_DirectoryEntry_Directory
Name.s = DirectoryEntryName(Num)
If Name <> "." And Name <> ".."
AddElement(RechercheFichier())
RechercheFichier()\NomElement = Dossier3 + "?1?" + Name
RechercheFichier()\Type = 2
AnalyseDossier(Num + 1, dossier + Name)
EndIf
EndIf
Wend
FinishDirectory(Num)
EndIf
EndProcedure
Procedure ExplorerDossier(ValTh.l)
dossier.s = "C:\" ;<<< A MODIFIER SELON TEMPS DISPO
If Right(dossier, 1) <> "\" : dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier
ClearGadgetItemList(#TreeExplorer) ;nettoyage du précédent arbre (mise à jour)
ClearList(RechercheFichier()) ;nettoyage de la liste
DossierRecherche = dossier
AnalyseDossier(0, dossier)
SortStructuredList(RechercheFichier(), 2, 0, #PB_Sort_String)
; On retire les ?1? et ?2?, et également l'adresse du dossier d'origine
ForEach RechercheFichier()
RechercheFichier()\NomElement = RemoveString(RemoveString(RechercheFichier()\NomElement, "?1?"), "?2?")
Next
; On rempli l'arbre avec les noms de fichiers
Nb_Dossier = 0
n = 0
ForEach RechercheFichier()
temp = CountString(RechercheFichier()\NomElement, "\")
If temp < Nb_Dossier ; Temp va être notre référence de niveau dans l'arbre
Nb_Dossier - 1
;icone.l = ExtractSmallIconFile(dossier+RechercheFichier()\NomElement) ; c'est mieux ainsi
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,0,temp)
ElseIf temp > Nb_Dossier
Nb_Dossier + 1
;icone.l= ExtractSmallIconFile(dossier+RechercheFichier()\NomElement)
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,0,temp)
Else
; icone.l = ExtractSmallIconFile(dossier+RechercheFichier()\NomElement)
AddGadgetItem(#TreeExplorer, -1, dossier+RechercheFichier()\NomElement,0,temp)
EndIf
n + 1
StatusBarText(#STATUSBAR, 0, "Listing total : "+Str(n)+" Patientez durant l'analyse...")
Next
StatusBarText(#STATUSBAR, 0, "Listing total : "+Str(CountGadgetItems(#TreeExplorer))+" - Analyse terminée.")
EndProcedure
If OpenWindow(#winex,50,50,600,400," ExplorerTreeGadget (1 seul répertoire)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#winex))
TreeGadget(#TreeExplorer,10,10,580,360)
If CreateStatusBar(#STATUSBAR, WindowID(#winex))
AddStatusBarField(600)
StatusBarText(#STATUSBAR, 0, "", #PB_StatusBar_Raised)
EndIf
EndIf
ThreadScan = CreateThread(@ExplorerDossier(),0) ; permet le refresh sans figer la fenêtre
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
;pour arrêter le thread avant fermeture
Resultat = IsThread(ThreadScan)
If Resultat <>0
KillThread(ThreadScan)
EndIf
End