[..] TreeView avec arborescence bien rangée

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 258
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Contact :
Status : Hors ligne

[..] TreeView avec arborescence bien rangée

#1

Message 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
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
http://webfreesoftware.net Les Logiciels Gratuits
Mon [UDF]

[UDF] GuiStatusBar facile (GuiStatusBarEx.au3) viewtopic.php?f=21&t=15370

Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1876
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

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

#2

Message par TommyDDR »

Vous ne faites qu'ajouter des items, jamais vous ne faites de recherche pour ajouter à telle ou telle branche.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

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

#3

Message 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

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11559
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 824
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#5

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6000
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#6

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 824
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#7

Message 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 !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6000
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#8

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Répondre