Page 1 sur 1
[..] Treeview retrouver l'index
Posté : ven. 02 oct. 2015 08:58
par cluster49
Bonjour,
A partir d'un "treeview" crée à la volée comme dans l'exemple ci-dessous je peux connaitre l'endroit où je me trouve dans l'arborescence grâce au bouton "Get Index".
Je souhaiterais obtenir le même résultat lorsque je clic directement dans l'arborescence (sans avoir besoin de cliquer sur le bouton). Est-ce envisageable ?
► Afficher le texte
Code : Tout sélectionner
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
#include <Array.au3>
$GUI = GUICreate("Test Script", 230, 300)
$TreeView = GUICtrlCreateTreeView(15, 20, 200, 230, -1, $WS_EX_CLIENTEDGE)
Global $aItems[11]
$aItems[0] = 10
For $i = 1 To 10
If Mod($i, 2) <> 0 Then
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, $TreeView)
Else
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, -1)
EndIf
Next
$GetIndex_Button = GUICtrlCreateButton("Get Index", 20, 270, 60, 20)
GUISetState(@SW_SHOW, $GUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $GetIndex_Button
$hSelected_Item = _GUICtrlTreeView_GetSelection($TreeView)
For $i = 1 To $aItems[0]
If $hSelected_Item = _GUICtrlTreeView_GetItemHandle($TreeView, $aItems[$i]) Then
$iIndex = $i
ExitLoop
EndIf
Next
ConsoleWrite("Selected Index = " & $iIndex & @LF)
EndSwitch
WEnd
Merci pour votre aide.
Re: [..] treeview retrouver l'index
Posté : ven. 02 oct. 2015 10:56
par Hugues
Salut,
Il va falloir passer par WM_NOTIFY()...
Re: [..] treeview retrouver l'index
Posté : ven. 02 oct. 2015 13:41
par Hugues
Un petit exemple de WM_Notify: (de Tlem)
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode", 1)
Dim $Gui
Dim $ItemTree[20]
Dim $ItemList[6]
$Gui = GUICreate("test", 300, 300)
$ItemTree[0] = GUICtrlCreateTreeView(10, 10, 280, 135)
For $i = 1 To 19
$ItemTree[$i] = GUICtrlCreateTreeViewItem(Random(0, 1000, 1), $ItemTree[Random(0, $i - 1, 1)])
Next
$ItemList[0] = GUICtrlCreateListView("Num1|Num2|Num3", 10, 155, 280, 135)
For $i = 1 To 5
$ItemList[$i] = GUICtrlCreateListViewItem(Random(0, 100, 1) & "|" & Random(0, 100, 1) & "|" & Random(0, 100, 1), $ItemList[0])
Next
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While (True)
Sleep(10)
WEnd
Func quit()
Exit
EndFunc ;==>quit
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $ItemTree[0]
$hWndListView = $ItemList[0]
If Not IsHWnd($ItemTree[0]) Then $hWndTreeview = GUICtrlGetHandle($ItemTree[0])
If Not IsHWnd($ItemList[0]) Then $hWndListView = GUICtrlGetHandle($ItemList[0])
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Local $tPoint, $tTVHEx, $TVhItem, $mX, $mY
$tPoint = _WinAPI_GetMousePos(True, $hWndTreeview)
$mX = DllStructGetData($tPoint, "X")
$mY = DllStructGetData($tPoint, "Y")
$tTVHEx = _GUICtrlTreeView_HitTestEx($hWndTreeview, $mX, $mY)
$TVhItem = DllStructGetData($tTVHEx, "Item")
If $TVhItem = 0x00000000 Then Return 0
Switch $iCode
Case $NM_CLICK
ConsoleWrite("Clic Gauche sur " & _GUICtrlTreeView_GetText($hWndTreeview, $TVhItem) & @LF)
Case $NM_RCLICK
ConsoleWrite("Clic Droit sur " & _GUICtrlTreeView_GetText($hWndTreeview, $TVhItem) & @LF)
EndSwitch
Return 0
Case $hWndListView
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $Index = DllStructGetData($tInfo, "Index")
If $Index = -1 Then Return 0
Switch $iCode
Case $NM_CLICK
ConsoleWrite("Clic Gauche sur la ligne d'index " & $Index & @LF)
Case $NM_RCLICK
ConsoleWrite("Clic Droit sur la ligne d'index " & $Index & @LF)
EndSwitch
Return 0
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Re: [..] Treeview retrouver l'index
Posté : ven. 02 oct. 2015 21:54
par mdanielm
Bonsoir,
Je débarque avec un peu de retard!
J'ai regardé Create, il y a la solution:
► Afficher le texte
Code : Tout sélectionner
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
#include <Array.au3>
$GUI = GUICreate("Test Script", 230, 300)
$TreeView = GUICtrlCreateTreeView(15, 20, 200, 230, -1, $WS_EX_CLIENTEDGE)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $aItems[11]
$aItems[0] = 10
For $i = 1 To 10
If Mod($i, 2) <> 0 Then
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, $TreeView)
Else
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, -1)
EndIf
Next
GUISetState(@SW_SHOW, $GUI)
do
until GUIGetMsg()= $GUI_EVENT_CLOSE
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview, $iIndex
$hWndTreeview = $TreeView
If Not IsHWnd($TreeView) Then $hWndTreeview = GUICtrlGetHandle($TreeView)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
if $hWndFrom = $hWndTreeview then
if $iCode = $TVN_SELCHANGEDW then
$hSelected_Item = _GUICtrlTreeView_GetSelection($TreeView)
local $yest=false, $i=1
while not $yest and $i<=$aItems[0]
$yest = $hSelected_Item = _GUICtrlTreeView_GetItemHandle($TreeView, $aItems[$i])
$i+=1
WEnd
if $yest Then ConsoleWrite("Selected Index = " & $i-1 & @LF)
Endif
EndIf
EndFunc ;== > WM_NOTIFY
Re: [..] Treeview retrouver l'index
Posté : ven. 02 oct. 2015 23:43
par mikell
Ce genre de syntaxe
Code : Tout sélectionner
$yest = $hSelected_Item = _GUICtrlTreeView_GetItemHandle($TreeView, $aItems[$i])
n'est absolument pas recommandé
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 08:13
par mdanielm
Même avec des parenthèses? $b = ($a=1)
Où je peux lire dans la doc ce que vous dites? je n'ai jamais eu aucun problème, quel que soit le langage.
....un booléen qui prend une valeur booléenne!
Donnez un contre exemple, vous avez le week-end.
J'ai modifié ces lignes car l'exitloop dans la boucle for ne permettait pas de traiter le cas où l'index cherché n'existait pas dans la liste.
Avec $yest je n'affiche que si j'ai trouvé l'index.
Cordialement
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 10:41
par mikell
Dans cette instruction le '=' est utilisé avec 2 usages différents (assignation et égalité) et l'absence de parenthèses rend cette syntaxe peu lisible et potentiellement source d'erreurs
Idem d'ailleurs pour toute instruction qui comporte plusieurs opérateurs et qui se contente d'exploiter leur précédence sans marquer les opérations par des parenthèses
Ce n'est pas parce que quelque chose marche que c'est forcément recommandé. Je suis surpris que toi qui défends ardemment la lisibilité et les bonnes pratiques tu ne comprennes pas ça
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 10:45
par walkson
Bonjour,
Donnez un contre exemple, vous avez le week-end.
Mikell a peut être d'autres chats à fouetter ce week-end ?
Un petit exemple plus simple:
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <StaticConstants.au3>
#include <File.au3>
#include <Array.au3>
$gui = GUICreate("My GUI with treeview", 350, 215)
$treeview = GUICtrlCreateTreeView(6, 6, 250, 200)
GUICtrlSendMsg ($treeview, $TVM_SETITEMHEIGHT, 20, 0) ; (la hauteur par défaut est 16 )
Global $FileList = _FileListToArray(@DesktopDir)
$nbfolder = $FileList[0]
Global $FileList1[$nbfolder + 1]
For $i = 1 To $nbfolder
$FileList1[$i] = GUICtrlCreateTreeViewItem($FileList[$i], $treeview)
Next
GUISetState()
;_ArrayDisplay($FileList1, "$FileList1")
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg > ""
$aa = ControlTreeView($gui, "", $treeview, "GetSelected" )
MsgBox(4160, "", "Selection 1: " & $aa)
ContinueCase
Case Else
For $i = 1 To $nbfolder
If $msg = $FileList1[$i] Then
$item = $FileList[$i]
MsgBox(4160, "", "Selection: " & $item)
EndIf
Next
EndSelect
WEnd
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 11:16
par mdanielm
On a tous un chat à fouetter.
Le sujet du différent est: $b=($a=1).
Je ne vois pas le rapport avec votre exemple.
Annoncez ce qu'il doit faire et ce que vous attendez de moi.
Si vous voulez que je vous supprime votre exitloop et votre while 1, voilà la solution:
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <StaticConstants.au3>
#include <File.au3>
#include <Array.au3>
$gui = GUICreate("My GUI with treeview", 350, 215)
$treeview = GUICtrlCreateTreeView(6, 6, 250, 200)
GUICtrlSendMsg ($treeview, $TVM_SETITEMHEIGHT, 20, 0) ; (la hauteur par défaut est 16 )
Global $FileList = _FileListToArray(@DesktopDir)
$nbfolder = $FileList[0]
Global $FileList1[$nbfolder + 1]
For $i = 1 To $nbfolder
$FileList1[$i] = GUICtrlCreateTreeViewItem($FileList[$i], $treeview)
Next
GUISetState()
;_ArrayDisplay($FileList1, "$FileList1")
$msg = GUIGetMsg()
While $msg <> $GUI_EVENT_CLOSE
Select
Case $msg > ""
$aa = ControlTreeView($gui, "", $treeview, "GetSelected" )
MsgBox(4160, "", "Selection 1: " & $aa)
;ContinueCase
Case Else
For $i = 1 To $nbfolder
If $msg = $FileList1[$i] Then
$item = $FileList[$i]
MsgBox(4160, "", "Selection: " & $item)
EndIf
Next
EndSelect
$msg = GUIGetMsg()
WEnd
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 11:45
par walkson
Mille regrets si je vous ai blessé, j'étais sur le ton de la plaisanterie.
Si je me suis permis de donner cet exemple, c'est parce qu'il n'utilise pas WM_NOTIFY() et qu'il me semble plus simple.
Après, la discussion au sujet de $b=($a=1), je ne suis qu'un simple usager du forum sans aucune qualification et donc sans avis... Je voulais tout simplement rendre service à cluster49
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 12:54
par mikell
mdanielm a écrit :On a tous un chat à fouetter.
Le sujet du différent est: $b=($a=1).
On se calme svp
Il n'y a pas de différent sur cette expression-là puisqu'elle comporte les parenthèses qui vont bien (ce qui n'est pas le cas dans le code posté)
Merci de prendre le temps de mieux relire mon message précédent
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 14:02
par mdanielm
Je suis d'accord qu'avec des parenthèses c'est plus lisible, et qu'elles deviennent indispensables dans:
$a=$b=$c=1 ---> $a = ($b=($c=1))
tout comme dans:
$a = $b=1? 2: $c? 3:4 -----> $a = ($b=1? 2: ($c=1? 3:4))
En même temps j'ai modifié rapidement un programme existant.
Quand à la fonction GUICtrlSendMsg, désolé, je ne comprends pas ce qu'elle fait.
(J'ai néanmoins corrigé la traduction de la page).
Je vous remercie de me lire attentivement et de critiquer mon style, je ne me vexerai jamais.
Cordialement
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 16:21
par mikell
Ben on est d'accord alors
@walkson
Ton script me fait penser à une corde tendue au-dessus d'un précipice : c'est vrai qu'elle peut permettre de traverser, mais tu as beaucoup plus de chances de te péter la gueule que d'arriver entier de l'autre côté
Pour aller
réellement au plus simple :
► Afficher le texte
Code : Tout sélectionner
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("Test Script", 230, 300)
$TreeView = GUICtrlCreateTreeView(15, 20, 200, 230, -1, $WS_EX_CLIENTEDGE)
Global $aItems[11]
$aItems[0] = 10
For $i = 1 To 10
If Mod($i, 2) <> 0 Then
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, $TreeView)
Else
$aItems[$i] = GUICtrlCreateTreeViewItem("Item" & $i, -1)
EndIf
Next
GUISetState()
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
For $i = 1 To $aItems[0]
If $msg = $aItems[$i] Then MsgBox(4160, "", "Selection: " & GuiCtrlRead($aItems[$i], 1) &@crlf& "Index: " & $i)
Next
WEnd
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 20:37
par mdanielm
Je n'ai fait que regarder l'exemple de la doc Create pour le TreeView.
Dans ta solution, je ne comprends pas pourquoi l'ID du message est égal à l'ID de l'item, mais ça marche.
A quel endroit on demande d'intercepter un click gauche?
Et si on voulait faire autre chose avec un clic droit?
La boucle for va systématiquement à la fin, elle pourrait s'interrompre avec EXITLOOP!
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 22:01
par mikell
mdanielm a écrit :Dans ta solution, je ne comprends pas pourquoi l'ID du message est égal à l'ID de l'item, mais ça marche.
GUIGetMsg :
The "event" returned is the control ID of the control sending the message
mdanielm a écrit :Et si on voulait faire autre chose avec un clic droit?
Ben faudrait un code différent... avec du WM_NOTIFY probablement
mdanielm a écrit :La boucle for va systématiquement à la fin, elle pourrait s'interrompre avec EXITLOOP!
C'est tout à fait exact (mais c'est un détail)
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 22:10
par walkson
@Mikell
c'est vrai le Case $msg > ""
$aa = ControlTreeView($gui, "", $treeview, "GetSelected" )
ça ressemble à renifler un peu partout pour retrouver son chemin.
Mais la deuxième partie
Code : Tout sélectionner
Case Else
For $i = 1 To $nbfolder
If $msg = $FileList1[$i] Then
$item = $FileList[$i]
MsgBox(4160, "", "Selection: " & $item)
EndIf
Next
y a pas de quoi fouetter un y a qu'un petit chouilla de différence avec ton code ou bien quelque chose m' échappe. Bon, c'est vrai, mon exemple est un peu brouillon...
Re: [..] Treeview retrouver l'index
Posté : sam. 03 oct. 2015 23:22
par mikell
Par exemple rajoute juste ça dans la gui et clique dessus
Code : Tout sélectionner
GUICtrlCreateLabel("test1", 280, 16, 30, 20)
GUICtrlCreateList("test2", 280, 56, 40, 20)
;etc