Page 1 sur 1

TreeViewToArray

Posté : dim. 15 mai 2016 08:50
par Koudou
Bonjour,

Etrangement je n'ai pas trouvé une fonction TreeViewToArray, ni dans GUITreeview.au3 ni sur les forums. Je poste donc ici une version pour ceux qui, comme moi, pourraient en avoir l'utilité.

Cette fonction parcours une treeview et génère un tableau avec une ligne par item et une colonne par niveau.
Func TreeViewToArray($idTreeView)
   Local $count = _GUICtrlTreeView_GetCount($idTreeView)
   Local $level
   Local $item = _GUICtrlTreeView_GetFirstItem($idTreeView)
   Local $max = 1
   Local $result[$count][$max]
   For $i = 0 to $count-1
     $level = _GUICtrlTreeView_Level($idTreeView,$item) +1
     If $level > $max Then
       $max = $level
       ReDim $result[$count][$max]
     EndIf
     $tmp = StringSplit(_GUICtrlTreeView_GetTree($idTreeView,$item), "|")
     For $j = 1 to $tmp[0]
       $result[$i][$j-1] = $tmp[$j]
     Next
     $item = _GUICtrlTreeView_GetNext($idTreeView,$item)
   Next
   Return $result
EndFunc

Re: TreeViewToArray

Posté : lun. 16 mai 2016 19:44
par mikell
En général il est de bonne pratique de poster un petit script d'exemple fonctionnel pour accompagner l'udf ... :wink:

Re: TreeViewToArray

Posté : mar. 17 mai 2016 21:02
par Koudou
Et hop !
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <Array.au3>

GUICreate("My GUI with treeview", 300, 400)
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
GUISetState(@SW_SHOW)

Global $MyTree = GUICtrlCreateTreeView(25, 20, 250, 300, BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
Local $items[8][4][4]
For $i = 0 to 7
   $items[$i][0][0] = _GUICtrlTreeView_AddChild($MyTree, 0, $i)
   For $j = 1 to 3
     $items[$i][$j][0] = _GUICtrlTreeView_AddChild($MyTree, $items[$i][0][0], $i & "-" & $j)
     For $k = 1 to 3
       $items[$i][$j][$k] = _GUICtrlTreeView_AddChild($MyTree, $items[$i][$j][0], $i & "-" & $j & "-" & $k)
     Next
   Next
Next

GUICtrlCreateButton("Exporter sous forme de tableau...", 50, 350, 200, 25)
GUICtrlSetOnEvent(-1, "Display")


While 1
   Sleep(100)
WEnd

Func Quit()
   Exit
 EndFunc

Func Display()
   $array = TreeViewToArray($MyTree)
   _ArrayDisplay($array)
EndFunc

Func TreeViewToArray($idTreeView)
   Local $count = _GUICtrlTreeView_GetCount($idTreeView)
   Local $level
   Local $item = _GUICtrlTreeView_GetFirstItem($idTreeView)
   Local $max = 1
   Local $result[$count][$max]
   For $i = 0 to $count-1
     $level = _GUICtrlTreeView_Level($idTreeView,$item) +1
     If $level > $max Then
       $max = $level
       ReDim $result[$count][$max]
     EndIf
     $tmp = StringSplit(_GUICtrlTreeView_GetTree($idTreeView,$item), "|")
     For $j = 1 to $tmp[0]
       $result[$i][$j-1] = $tmp[$j]
     Next
     $item = _GUICtrlTreeView_GetNext($idTreeView,$item)
   Next
   Return $result
EndFunc
[/code]

Re: TreeViewToArray

Posté : mar. 17 mai 2016 22:45
par mikell
C'est beaucoup mieux :mrgreen:
Bonne idée cette fonction. Idéalement il faudrait lui intégrer de la gestion d'erreur, et prévoir/anticiper d'éventuels petits soucis, par exemple dans ce cas :

Code : Tout sélectionner

       For $j = 1 to 3
          $items[$i][$j][0] = _GUICtrlTreeView_AddChild($MyTree, $items[$i][0][0], "|" & Chr(Random(65, 90, 1)))
où la treeview s'affiche correctement mais la fonction plante
Après ça tu pourrais la mettre dans 'Fonctions et udfs' :wink: