Page 1 sur 1

[..] TreeView avec arborescence bien rangée

Posté : ven. 05 juin 2020 16:53
par Anthony
Bonjour à tous,

Je cherche à classer par arborescences, mais jusqu'ici sans succès, ce qui donnerai 2 arborescences, SONY et Xiaomi.
On va peut-être croire que je le fait exprès mais c'est pas le cas :|
Merci d'avance à tous :wink:

Code : Tout sélectionner

SONY
    + Smartphone
                + Z2
                + Z5
                + XZ Premium
                            + François Pignon
                            + Dupont Durand
                                             + General
                                             + HDR
                                             + ...
Xiaomi
    + Drone
                + FIMI X8 SE
                + FIMI A3
                            + François Pignon
                            + Dupont Durand
                                             + General
                                             + HDR
                                             + ...

Code : Tout sélectionner

; https://www.autoitscript.com/forum/topic/137148-_guictrltreeview_getselection-help/?do=findComment&comment=959711

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>

; Set flag
$fFlag = False

; Create GUI
$hGUI = GUICreate("Test", 500, 500)

$hTreeView = _GUICtrlTreeView_Create($hGUI, 10, 10, 480, 480, -1, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME+$WS_EX_CLIENTEDGE)	; $WS_EX_CLIENTEDGE, $WS_EX_DLGMODALFRAME), $WS_EX_CLIENTEDGE)

; ===> Read from list of files "Xiaomi,Drone,FIMI X8 SE,François Pignon,General.ini" etc..
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,General,HDR.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,General,HDR.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI A3,François Pignon,General,HDR.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Vivid.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z2,Dupont Durand,4K.ini')					; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,BW.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Art.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,XZ Premium,François Pignon,4K.ini')			; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Film.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z2,François Pignon,1080p.ini')				; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Clasic.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z5,François Pignon,4K.ini')						; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Nostalgia.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,F-Log.ini')
; <=== Read from list of files "Xiaomi,Drone,FIMI X8 SE,François Pignon,General.ini" etc..

;~ _GUICtrlTreeView_Expand($hTreeView)

GUISetState()


; Register message
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Loop
While 1

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

WEnd

Func _TreeView( $id_Ctrl, $iSet)	; $iSet = 'General,Vivid,BW,Art,Film,Clasic,Nostalgia,F-Log.ini'
   If Not IsHWnd($id_Ctrl) Then Local $hWnd = GUICtrlGetHandle($id_Ctrl)
   $aSetExt	= StringSplit( $iSet, ".")
   $aSet	= StringSplit( $aSetExt[1], ",")

   ; Create handle array
   Global $aItem_Handles[UBound($aSet)]	; $aItem_Handles[$j]

   _GUICtrlTreeView_BeginUpdate($hTreeView)	; <============ Start UpDate
   For $i = 1 To UBound($aSet) - 1
	  If $i = 1 Then
		 $aItem_Handles[$i] = _GUICtrlTreeView_Add($hTreeView, 0, $aSet[$i])
	  Else
		 If $i = UBound($aSet) - 1 Then
			$aItem_Handles[$i] = _GUICtrlTreeView_AddChild( $hTreeView, $Last, $iSet)
		 Else
			$aItem_Handles[$i] = _GUICtrlTreeView_AddChild( $hTreeView, $Last, $aSet[$i])
		 EndIf
	  EndIf
	  Local $Last = $aItem_Handles[$i]

	  If $i = UBound($aSet) - 1 Then
		 _GUICtrlTreeView_SetIcon( $hTreeView, $Last, "shell32.dll", 72)
	  Else
		 _GUICtrlTreeView_SetIcon( $hTreeView, $Last, "shell32.dll", 3)
	  EndIf

	  ConsoleWrite('$aItem_Handles[$i='&$i&']='&$aItem_Handles[$i] &@TAB&@TAB& '$aSet[$i='&$i&']='&$aSet[$i] &@CRLF)
   Next
   _GUICtrlTreeView_EndUpdate($hTreeView)		; <============ End UpDate
   ConsoleWrite(@CRLF)
EndFunc

; Intercept the NOTIFY leassages
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    ; Read the data
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    ; See if it was our treeview
    Switch $hWndFrom
        Case $hTreeview
            ; Work out which item is under cursor
            $aPos = GUIGetCursorInfo($hGUI)
            $iIndex = _GUICtrlTreeView_HitTestItem($hTreeview, $aPos[0] - 10, $aPos[1] - 10)

            ; Look for code
            Switch $iCode
                Case $NM_CLICK
                    ; Get item text
					ConsoleWrite('$iIndex='&$iIndex &@TAB& "You clicked L button: " & _GUICtrlTreeView_GetText($hTreeview, $iIndex) & @CRLF)

;~                     For $i = 0 To $aItem_Handles[0]
;~                         If $aItem_Handles[$i] = $iIndex Then
;~                             ConsoleWrite("You clicked: " & _GUICtrlTreeView_GetText($hTreeview, $aItem_Handles[$i]) & @CRLF)
;~                             ExitLoop
;~                         EndIf
;~                     Next
                Case $NM_RCLICK
                    ; Click on that item
					ConsoleWrite('$iIndex='&$iIndex &@TAB& "You clicked R button: " & _GUICtrlTreeView_GetText($hTreeview, $iIndex) & @CRLF)

;~                     For $i = 0 To $aItem_Handles[0]
;~                         If $aItem_Handles[$i] = $iIndex Then
;~                             _GUICtrlTreeView_ClickItem($hTreeview, $aItem_Handles[$i])
;~                             ExitLoop
;~                         EndIf
;~                     Next
            EndSwitch
    EndSwitch
EndFunc

Re: [..] TreeView avec arborescence bien rangée

Posté : ven. 05 juin 2020 18:32
par TommyDDR
Vous ne faites qu'ajouter des items, jamais vous ne faites de recherche pour ajouter à telle ou telle branche.

Re: [..] TreeView avec arborescence bien rangée

Posté : ven. 05 juin 2020 21:47
par mdanielm
C'est une très mauvaise idée de mettre les données dans le code.
Etape 1:
Créer une fichier texte comprenant la structure, nommé le data.txt

SONY
/Smartphone
//Z2
//Z5
//XZ Premium
///François Pignon
///Dupont Durand
////General
////HDR
////…

Xiaomi
/Drone
//FIMI X8 SE
//FIMI A3
///François Pignon
///Dupont Durand
////General
////HDR
////…

Si le '/' ne vous plait mettez n'importe quelle chaîne à la place par exemple '+-'

Etape 2:
Ecrivez une fonction qui crée le Treeview à partir de data.txt

func txt2treeeview($hdleTV, $fileName, $sch="/")

Cordialement

Re: [..] TreeView avec arborescence bien rangée

Posté : ven. 05 juin 2020 23:27
par Tlem
Bonsoir.
En ce qui me concerne, un fichier xml voir plus récent json me semblerais plus approprié. De plus il serait directement exploitable avec l'UDF approprié. ^^

XML : https://www.autoitscript.com/forum/sear ... =relevancy
JSON : https://www.autoitscript.com/forum/sear ... =relevancy

Re: [..] TreeView avec arborescence bien rangée

Posté : sam. 06 juin 2020 18:48
par walkson
Bonjour,
Vous devriez regarder à cette adresse https://www.autoitscript.com/forum/topi ... /#comments
Melba reprend l'idée de Daniel, exemple
[TreeView]
data=A|~AA|~~AAA|~~~1|~~~2|~~34|~~~1|~~~2|#B|~BA|~#BB|~~BBA|~~BBB|~~#BBC|~BC|C|~CA|~~123|~~456|~~789|D|~DA|~~DAA|aaa|aaa
ou bien en plus simple https://www.autoitscript.com/forum/topi ... nt=1204268

Re: [..] TreeView avec arborescence bien rangée

Posté : sam. 06 juin 2020 19:55
par mikell
Il y a encore plus simple :roll:
Personnellement l'idée d'une chaine du genre "Xiaomi,Drone,FIMI X8 SE,Dupont Durand,General,HDR.ini" ne me dérange absolument pas, parce qu'on peut conserver le concept pour des chemins de fichier par exemple
L'avantage c'est aussi de pouvoir stocker les données dans un csv, avec des mises à jour faciles

La finesse est de trouver la combine pour vérifier si un item (ou sous-item) existe déjà pour être sûr de placer le fourbi au bon endroit :mrgreen:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>

$hGUI = GUICreate("Test", 500, 500)
$hTreeView = _GUICtrlTreeView_Create($hGUI, 10, 10, 480, 480, -1, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME+$WS_EX_CLIENTEDGE)   ; $WS_EX_CLIENTEDGE, $WS_EX_DLGMODALFRAME), $WS_EX_CLIENTEDGE)

; ===> Read from list of files "Xiaomi,Drone,FIMI X8 SE,François Pignon,General.ini" etc..
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,General,HDR.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI A3,François Pignon,General,HDR.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Vivid.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z2,Dupont Durand,4K.ini')             ; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,BW.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Art.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,XZ Premium,François Pignon,4K.ini')        ; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Film.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z2,François Pignon,1080p.ini')          ; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,Clasic.ini')
_TreeView( $hTreeView, 'SONY,SmartPhone,Z5,François Pignon,4K.ini')                ; <=== SmartPhone
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Nostalgia.ini')
_TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,François Pignon,F-Log.ini')
; <=== Read from list of files "Xiaomi,Drone,FIMI X8 SE,François Pignon,General.ini" etc..
;~ _GUICtrlTreeView_Expand($hTreeView)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func _TreeView($hTreeView, $iSet)  

   Local $aSet = StringSplit($iSet, ",", 2) , $aItem_Handles[UBound($aSet)]
   Local $path = $aSet[0]

   _GUICtrlTreeView_BeginUpdate($hTreeView)  ; <============ Start UpDate

   For $i = 0 To UBound($aSet) - 1
     If $i = 0 Then
      $h = _GUICtrlTreeView_FindItemEx($hTreeView, $path)
      $aItem_Handles[$i] = ($h = 0 ? _GUICtrlTreeView_Add($hTreeView, 0, $path) : $h)
     Else
      $path &= "|" & $aSet[$i]
      $h = _GUICtrlTreeView_FindItemEx($hTreeView, $path)
      $aItem_Handles[$i] = ($h = 0 ? _GUICtrlTreeView_AddChild( $hTreeView, $Last, $aSet[$i]) : $h)
     EndIf
     Local $Last = $aItem_Handles[$i]
   _GUICtrlTreeView_SetIcon( $hTreeView, $Last, "shell32.dll", ($i = UBound($aSet)-1) ? 72 : 3)
   Next

   _GUICtrlTreeView_EndUpdate($hTreeView)    ; <============ End UpDate
EndFunc

Re: [..] TreeView avec arborescence bien rangée

Posté : sam. 06 juin 2020 21:44
par walkson
Il y a une erreur avec $Last (utilisé avant sa déclaration). Du coup j'ai rajouté $Last = $aItem_Handles[0] avant la boucle

@Anthony, attention, Michel a mélangé les données comme _TreeView( $hTreeView, 'Xiaomi,Drone,FIMI A3,François Pignon,General,HDR.ini') qui devrait être _TreeView( $hTreeView, 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,General,HDR.ini') mais bon, comme votre arborescence en tête de votre demande est totalement fausse, on en fera pas un plat :lol:
En tout cas, je garde le code de Michel sous le coude !

Re: [..] TreeView avec arborescence bien rangée

Posté : dim. 07 juin 2020 09:35
par mikell
Il pleut alors voilà le même sommairement optimisé pour csv
Si le séparateur est un backslash au lieu d'une virgule, ça marche pour des chemins de fichier

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>

$txt = 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,General,HDR.ini' & @crlf & _
   'Xiaomi,Drone,FIMI A3,François Pignon,General,HDR.ini' & @crlf & _
   'Xiaomi,Drone,FIMI X8 SE,François Pignon,Vivid.ini' & @crlf & _
   'SONY,SmartPhone,Z2,Dupont Durand,4K.ini' & @crlf & _       
   'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,BW.ini' & @crlf & _
   'Xiaomi,Drone,FIMI X8 SE,François Pignon,Art.ini' & @crlf & _
   'SONY,SmartPhone,XZ Premium,François Pignon,4K.ini' & @crlf & _  
   'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Film.ini' & @crlf & _
   'SONY,SmartPhone,Z2,François Pignon,1080p.ini' & @crlf & _
   'Xiaomi,Drone,FIMI X8 SE,François Pignon,Clasic.ini' & @crlf & _
   'SONY,SmartPhone,Z5,François Pignon,4K.ini' & @crlf & _
   'Xiaomi,Drone,FIMI X8 SE,François Pignon,F-Log.ini'


$hGUI = GUICreate("Test", 500, 500)
$hTreeView = _GUICtrlTreeView_Create($hGUI, 10, 10, 480, 480, -1, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME+$WS_EX_CLIENTEDGE)   ; $WS_EX_CLIENTEDGE, $WS_EX_DLGMODALFRAME), $WS_EX_CLIENTEDGE)
_TreeView_Build($hTreeView, $txt)
 _GUICtrlTreeView_Expand($hTreeView, _GUICtrlTreeView_FindItem($hTreeView, 'Xiaomi'))
GUISetState()

; update
Sleep(2000)
$add = 'Xiaomi,Drone,FIMI X8 SE,Dupont Durand,Nostalgia.ini'
_TreeView_Add($hTreeView, $add)
 _GUICtrlTreeView_Expand($hTreeView, _GUICtrlTreeView_FindItem($hTreeView, 'Xiaomi'))

Sleep(2000)
$add = 'Xiaomi,Drone,test,ziss,ize,maille,test_f.ini'
_TreeView_Add($hTreeView, $add)
 _GUICtrlTreeView_Expand($hTreeView, _GUICtrlTreeView_FindItem($hTreeView, 'test'))


While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func _TreeView_Build($hTreeView, $iSet)  
   $aTxt = StringSplit($iSet, @crlf, 3)
   For $k = 0 to UBound($aTxt)-1
      _TreeView_Add($hTreeView, $aTxt[$k])  
   Next
EndFunc


Func _TreeView_Add($hTreeView, $iSet)  
    Local $aSet   = StringSplit($iSet, ",", 2) , $aItem_Handles[UBound($aSet)]
    Local $Last = 0, $path = $aSet[0]
   _GUICtrlTreeView_BeginUpdate($hTreeView)
   For $i = 0 To UBound($aSet) - 1
     If $i = 0 Then
      $h = _GUICtrlTreeView_FindItemEx($hTreeView, $path)
      $aItem_Handles[$i] = ($h = 0 ? _GUICtrlTreeView_Add($hTreeView, 0, $path) : $h)
     Else
      $path &= "|" & $aSet[$i]
      $h = _GUICtrlTreeView_FindItemEx($hTreeView, $path)
      $aItem_Handles[$i] = ($h = 0 ? _GUICtrlTreeView_AddChild( $hTreeView, $Last, $aSet[$i]) : $h)
     EndIf
     $Last = $aItem_Handles[$i]
    _GUICtrlTreeView_SetIcon($hTreeView, $Last, "shell32.dll", ($i = UBound($aSet)-1) ? 72 : 3)
    Next
  _GUICtrlTreeView_EndUpdate($hTreeView) 
EndFunc

Re: [..] TreeView avec arborescence bien rangée

Posté : mar. 23 nov. 2021 00:26
par Anthony
Merci pour vos recherches, je ne connaissait pas le format .json ;)
Je regarderai quand j'aurai un peu de temps :mrgreen: