[R] Lier des actions à des Items TreeView

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

[R] Lier des actions à des Items TreeView

#1

Message par stramor »

Tout d'abord bonjour à tous!

Alors voilà ma question, je suis actuellement en train de réaliser un programme avec un TreeView chargé à partir d'un fichier .ini , mon problème et que je voudrais lier le double clique sur les items du TreeView à des actions, comme ouvrir une page internet ou un dossier(exemple: ShellExecute("www.google.com") ).
(j'ai déjà la fonction permettant de détecter un clique sur un Item) Il reste à lier l'action automatiquement à partir d'un lien dans le fichier .ini à chaque Item.

Je m'en remet à vous pour m'aider ou simplement m'aiguiller, merci d'avance!


exemple fichier.ini:
[lien]
google=//www.google.fr
[DOC]
mes documents=C\Bibliothèques\Documents
[autres liens]
programmation=autoit;https://www.autoitscript.fr/ |exemple;www.exemple.com
programme:
;
;                                       TEST v.1
;
;includes------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListboxConstants.au3>
#include <EditConstants.au3>
#include <GuiTreeView.au3>
#include <Array.au3>

;initialisation variables--------------------------------------------------------------------------------------------------------------------------------------------------------------

$fDblClk = False
Dim  $i, $var, $file, $TreeView1, $var2, $TreeView2, $TreeView3, $test1, $varx, $var, $file, $x
$file = "fichier.ini"

;initialisation GUI--------------------------------------------------------------------------------------------------------------------------------------------------------------------

$GUI = GUICreate("TEST", 300 , @DesktopHeight, @DesktopWidth-300 , 0,$WS_POPUP);création de la fenêtre
$barredep = GUICtrlCreateLabel("                                 TEST", 0, 0, 300, 20, -1, $GUI_WS_EX_PARENTDRAG) ;barre de déplacement du widget
$barredep = GuiCtrlSetColor(-1,0X0000FF)
$barredep = GUICtrlSetBkColor (-1,0X606060)
$list = GUICtrlCreateTreeView(0, 40, 300,@DesktopHeight-60 , BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE);création de la liste
GUISetState(@SW_SHOW, $GUI)

;initialisation----------------------------------------------------------------------------------------------------------------------------------------------------------------------

GUIRegisterMsg($WM_NOTIFY, "MY_WM_NOTIFY") ; initialisation double clique list
_IniGetSectionNames();fonction chargement liste à partir d'un fichier ini

;evenementiel GUI----------------------------------------------------------------------------------------------------------------------------------------------------------------------
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

       EndSwitch

         If $fDblClk = True Then ; fonction en cas de double clique sur la liste
            $sText = _GUICtrlTreeView_GetText($list, _GUICtrlTreeView_GetSelection($list)); recupération de l'élément sélectionné dans la liste

            ;...



          $fDblClk = False ; remise à zéro de la variable pour pouvoir double cliquer à nouveau
         EndIf

    WEnd
;libération de la mémoire------------------------------------------------------------------------------------------------------------------------------------------------------------

;fonctions---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam); fonction détection double clique sur liste

    Switch $wParam
        Case $list
            Local $tagNMHDR = DllStructCreate("int;int;int", $lParam)
            If @error Then Return
            If DllStructGetData($tagNMHDR, 3) = $NM_DBLCLK Then $fDblClk = True
    EndSwitch
    $tagNMHDR = 0

EndFunc

;fonction remplissage liste----------------------------------------------------------------------------------------------------------------------------------------------------------
Func _IniGetSectionNames()
    $varx = IniReadSectionNames($file)
    If @error Then
        MsgBox(4096, "", "Error occured, probably no INI file.")
    Else
        For $x = 1 To $varx[0]
            _IniReadInfo($varx[$x])
        Next
    EndIf
EndFunc
;fonction remplissage liste suite----------------------------------------------------------------------------------------------------------------------------------------------------
Func _IniReadInfo($sSection)
    Dim $sValue
    $var = IniReadSection($file, $sSection)
    If @error Then
        MsgBox(4096, "", "Error occured, check INI file.")
    Else
        $TreeView2 = GUICtrlCreateTreeViewitem($sSection, $list)
        For $i = 1 To $var[0][0]
            $TreeView3 = GUICtrlCreateTreeViewItem($var[$i][0], $TreeView2)
            $sValue = StringSplit($var[$i][1], '|')
            For $x = 1 To $sValue[0]
                if $sValue[$x] <> '' Then $TreeView4 = GUICtrlCreateTreeViewitem($sValue[$x], $TreeView3)
            Next
        Next
    EndIf
EndFunc
Modifié en dernier par stramor le mar. 30 août 2016 10:44, modifié 1 fois.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#2

Message par mdanielm »

Peut-être la fonction: _GUICtrlTreeView_HitTestItem
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#3

Message par stramor »

Merci de ta réponse mdanielm!

Je vais regarder ça, mais j'ai aussi trouvé une alternative, je te tiendrais au courant dès que j'aurais avancé :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: lier des actions à des Items TreeView

#4

Message par mikell »

Si je mets ça dans ton code, ça a l'air de marcher (avec le ini fourni)
If $fDblClk = True Then ; fonction en cas de double clique sur la liste
                   $sText = _GUICtrlTreeView_GetText($list, _GUICtrlTreeView_GetSelection($list)); recupération de l'élément sélectionné dans la liste
     $url = StringSplit($sText, ";")
     ShellExecute( $url[0]>1 ? $url[2] : $sText)
" 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 : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: lier des actions à des Items TreeView

#5

Message par walkson »

question: avec

Code : Tout sélectionner

Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
on ne peut pas retrouver le handle sélectionné ?
ça serait plus simple !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#6

Message par stramor »

Houla Merci à tous!

@mikell merci de ton idée! Mais comme je l'ai dit j'ai trouvé une alternative, je posterai le code d'ici demain car il me reste des bugs pour le coup

@walkson c'est à dire ? ^^'
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: lier des actions à des Items TreeView

#7

Message par walkson »

est ce que

Code : Tout sélectionner

Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
peut retouner le handle sélectionné ?
c'est une question que je me pose sans avoir la réponse :?
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#8

Message par stramor »

Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
me permet de récupérer l'item de la viewlist sélectionné. (c'est une fonction que j'ai trouvé sur le net à vrai dire)
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#9

Message par stramor »

Rebonjour à tous!

Alors voilà la solution que j'ai trouvé, enregistrer dans le tableau $reference[][] le nom de l'Item du Treeview et y associer le lien. mon code fonctionne bien, mais j'ai un bug, lorsque l'on double clique sur le petit "+" pour étendre la liste cela ouvre quand même le lien qui y est associé, si quelqu'un pouvait m'aider à régler ce soucis :)

merci d'avance!

fichier.ini:
[lien]
google;//www.google.fr=autoit;https://www.autoitscript.fr
google2;//www.google.com=//www.google.com;https://www.autoitscript.fr
[DOC]
mes documents;=C\Bibliothèques\Documents;
[autres liens]
programmation;=autoit2;https://www.autoitscript.fr/ |exemple;www.exemple.com

code:
;
;                                       TEST v.1
;
;includes------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListboxConstants.au3>
#include <EditConstants.au3>
#include <GuiTreeView.au3>
#include <Array.au3>

;initialisation variables--------------------------------------------------------------------------------------------------------------------------------------------------------------

$fDblClk = False
Dim  $i, $var, $file, $TreeView1, $var2, $TreeView2, $TreeView3, $test1, $varx, $var, $file, $x, $reference[100][3], $nbreference = 0, $z
$file = "fichier.ini"

;initialisation GUI--------------------------------------------------------------------------------------------------------------------------------------------------------------------

$GUI = GUICreate("TEST", 300 , @DesktopHeight, @DesktopWidth-300 , 0,$WS_POPUP);création de la fenêtre
$barredep = GUICtrlCreateLabel("                                 TEST", 0, 0, 300, 20, -1, $GUI_WS_EX_PARENTDRAG) ;barre de déplacement du widget
$barredep = GuiCtrlSetColor(-1,0X0000FF)
$barredep = GUICtrlSetBkColor (-1,0X606060)
$list = GUICtrlCreateTreeView(0, 40, 300,@DesktopHeight-60 , BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE);création de la liste
GUISetState(@SW_SHOW, $GUI)

;initialisation----------------------------------------------------------------------------------------------------------------------------------------------------------------------

GUIRegisterMsg($WM_NOTIFY, "MY_WM_NOTIFY") ; initialisation double clique list
_IniGetSectionNames();fonction chargement liste à partir d'un fichier ini

;evenementiel GUI----------------------------------------------------------------------------------------------------------------------------------------------------------------------
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

       EndSwitch

         If $fDblClk = True Then ; fonction en cas de double clique sur la liste
            $sText = _GUICtrlTreeView_GetText($list, _GUICtrlTreeView_GetSelection($list)); recupération de l'élément sélectionné dans la liste
             For $z = 0 To $nbreference
             if $reference[$z][1] = $sText Then
               if $reference[$z][2] <> '' Then ShellExecute($reference[$z][2])
              endif
            Next


          $fDblClk = False ; remise à zéro de la variable pour pouvoir doublecliquer à nouveau
         EndIf

    WEnd
;libération de la mémoire------------------------------------------------------------------------------------------------------------------------------------------------------------

;fonctions---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam); fonction detection double clique sur liste

    Switch $wParam
        Case $list
            Local $tagNMHDR = DllStructCreate("int;int;int", $lParam)
            If @error Then Return
            If DllStructGetData($tagNMHDR, 3) = $NM_DBLCLK Then $fDblClk = True
    EndSwitch
    $tagNMHDR = 0

EndFunc

;fonction remplissage liste----------------------------------------------------------------------------------------------------------------------------------------------------------
Func _IniGetSectionNames()
    $varx = IniReadSectionNames($file)
    If @error Then
        MsgBox(4096, "", "Error occured, probably no INI file.")
    Else
        For $x = 1 To $varx[0]
            _IniReadInfo($varx[$x])
        Next
    EndIf
EndFunc
;fonction remplissage liste suite----------------------------------------------------------------------------------------------------------------------------------------------------
Func _IniReadInfo($sSection)
    Dim $sValue
    $var = IniReadSection($file, $sSection)
    If @error Then
        MsgBox(4096, "", "Error occured, check INI file.")
    Else
        $TreeView2 = GUICtrlCreateTreeViewitem($sSection, $list)
        For $i = 1 To $var[0][0]
         Local $temporaire = StringSplit($var[$i][0], ';')
            $TreeView3 = GUICtrlCreateTreeViewItem($temporaire[1], $TreeView2)
         $reference[$nbreference][1] = $temporaire[1]
         if $temporaire[2] <> '' Then ;test si lien associé à l'item de la viewlist
         $reference[$nbreference][2] = $temporaire[2] ;ajout d'un lien associé à l'item de la viewlist
         GuiCtrlSetColor(-1,0X0000FF)
         EndIf
         $nbreference = $nbreference + 1
            $sValue = StringSplit($var[$i][1], '|')
            For $x = 1 To $sValue[0]
                if $sValue[$x] <> '' Then
               $temporaire = StringSplit($sValue[$x], ';')
               $TreeView4 = GUICtrlCreateTreeViewitem($temporaire[1], $TreeView3)
               $reference[$nbreference][1] = $temporaire[1]
               if $temporaire[2] <> '' Then ;test si lien associé à l'item de la viewlist
               $reference[$nbreference][2] = $temporaire[2] ;ajout d'un lien associé à l'item de la viewlist
               GuiCtrlSetColor(-1,0X0000FF)
               endif
               $nbreference = $nbreference + 1
               endif
            Next
        Next
    EndIf
 EndFunc
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#10

Message par stramor »

n'hésitez pas si vous voulez des précisions sur mon code! merci
stramor
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 25 août 2016 10:48
Status : Hors ligne

Re: lier des actions à des Items TreeView

#11

Message par stramor »

Bon j'ai trouvé une alternative, à chaque double clique je vire le focus du Treeview Item
Répondre