Interaction avec un TreeView

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
kent0010
Niveau 1
Niveau 1
Messages : 1
Enregistré le : jeu. 25 janv. 2018 13:58
Status : Hors ligne

Interaction avec un TreeView

#1

Message par kent0010 »

Bonjour,

Je suis actuellement en train de développer une macro qui doit interagir avec un TreeView, j'ai récemment commencé a utiliser les "_Gui".
Malheureusement, je ne trouve pas de moyen de sélectionner un TreeView dont je ne connais pas encore le Handle.

1. J'aimerais pouvoir sélectionner le TreeView et attendre une retour d'information comme quoi cela est fait avant de passer a la suite de mon programme. (Un peux comme avec un WinwaitActive)

2. J'aimerais enregistré dans un tableau la totalité des handles du TreeView. Sachant que mon TreeView peux facilement atteindre les 2-3 milles éléments et que je ne connait pas le nombre d’élément le composant, il me faudrait une solution plus rapide qu'une boucle qui redimensionne mon tableau a chaque ajout d'un élément. (déjà essayer et très, très ,très long)

Mon problème pour le 1 étant que ma fenêtre est une sous fenêtre d'une sous fenêtre d'une fenêtre (voir image a la fin pour une meilleur compréhension).
Le but du 2 est d'accélérer la navigation au sein du TreeView (Actuellement j'utilise un send("{DOWN}") suivis d'un sleep(100) pour parcourir mon TreeView)

La fenêtre a atteindre est celle encadré en rouge. Toutes les fenêtre contenant la fenêtre cible seront entouré de différente couleur.

Image

Merci d'avance a tous ceux qui prendront le temps de me lire.



Cordialement.
PS: désoler pour les fautes d'orthographe si il en reste.
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 140
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: Interaction avec un TreeView

#2

Message par A2Energie »

Salut Kent,

$hWnd = ControlGetHandle("Titre", "", "[CLASS:Sys TreeView32; INSTANCE:1]")
MsgBox(0, "Est ce un Handle ?", $hWnd & @CRLF & IsHWnd($hWnd)) ; La tu as le Handle de ton arbre

$hWnd_1 = _GUICtrlTreeView_GetFirstItem($hWnd) ;
MsgBox(0, "Est ce un Handle ?", $hWnd_1 & @CRLF & IsHWnd($hWnd_1 )) ; La tu as le Handle du premier item

Ensuite tu fais une boucle pour récupérer l'ensemble des handles.
J'ai trouvé ca, faut juste l'adapter :
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GetIndex_Button
            $iIndex = 0
            $hItem = _GUICtrlTreeView_GetFirstItem($TreeView)
            For $i = 0 To _GUICtrlTreeView_GetCount($TreeView)-1
                If _GUICtrlTreeView_GetSelected($TreeView, $hItem) Then $iIndex = $i+1
                $hItem = _GUICtrlTreeView_GetNext($TreeView, $hItem)
            Next
            MsgBox(64, "", StringFormat("Selected Text: %s\nSelected Index: %i", GUICtrlRead($TreeView, 1), $iIndex), 0, $GUI)
    EndSwitch
WEnd
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: Interaction avec un TreeView

#3

Message par walkson »

Bonjour,
L'outil pour manœuvrer les treeviews externes est ControlTreeView ()
il me faudrait une solution plus rapide qu'une boucle
Je ne vois pas de solution pour visiter un treeview en dehors de boucles !
Voici un exemple avec le treeview de l'aide d'Autoit. Il faudra mettre à jour les chemins. Ici, j'utilise "AutoIt Help (v3.3.14.2)" qui n'est pas le plus récent
#include <Array.au3>
Local $array[0][4]
Local $arrayE
If Not ProcessExists('AutoIt3Help.exe') Then ShellExecute("C:\Program Files\AutoIt3\AutoIt.chm")
;se positionne sur le tab Sommaire
Do
$aa = ControlCommand ( "AutoIt Help (v3.3.14.2)", "", "SysTabControl321", "CurrentTab", "")
If $aa <> 1 Then ControlCommand ( "AutoIt Help (v3.3.14.2)", "", "SysTabControl321", "TabLeft", "")
Until $aa = 1
Sleep(500)
;compte le nombre d'éléments à la base (ici, 2)
$bb = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetItemCount", "")
MsgBox(0,"nb éléments",$bb)
$timer = TimerInit()
;visite l'arbre sur ses 4 niveaux
For $i = 0 To $bb - 1
$NV1 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetItemCount", "#" & $i);compte le nombre d'éléments contenus dans ce niveau
$edit1 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", "#" & $i ); récupère le texte
   For $y = 0 To $NV1 - 1
   $NV2 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetItemCount", "#" & $i & "|#" & $y);compte le nombre d'éléments contenus dans ce niveau etc...
   $edit2 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", "#" & $i & "|#" & $y )
   If ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "Exists", "#" & $i & "|#" & $y & "|#0" ) = 0 Then
      ;s'il n'y pas de niveau supérieur, enregistre les données
   $arrayE &= ($edit1 &"|"&  $edit2 & @CRLF)
   EndIf
      For $x = 0 To $NV2 - 1
      $NV3 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetItemCount", "#" & $i & "|#" & $y & "|#" & $x)
      $edit3 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", "#" & $i & "|#" & $y & "|#" & $x )
      ToolTip($i &"--"& $y &"--"&  $x &"--"&  $x &"--"&  $edit3 & @CR,100,100);totalement inutile mais fait patienter
      If ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "Exists", "#" & $i & "|#" & $y & "|#" & $x & "|#0" ) = 0 Then
      $arrayE &=($edit1 &"|"& $edit2 &"|"& $edit3 & @CRLF)
      EndIf
            For $q = 0 To $NV3 - 1
            $NV4 = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", "#" & $i & "|#" & $y & "|#" & $x & "|#" & $q)
            ToolTip($i &"--"& $y &"--"&  $x &"--"&  $x &"--"&   $q &"--"&   $NV4 & @CR,100,100)
            $arrayE &= ($edit1 &"|"& $edit2 &"|"&  $edit3 &"|"&  $NV4 & @CRLF)
            Next
      Next
   Next

Next
ConsoleWrite("nb minutes " & (TimerDiff($timer)/60000) & @CRLF)
_ArrayAdd($array,$arrayE)
_ArrayDisplay($array)
C'est long, plus de 16 minutes d'attente pour 3092 lignes !
Ce qui nous donne
AutoIt|Introduction||
AutoIt|License||
AutoIt|Installation Directory||
AutoIt|Frequently Asked Questions (FAQ)||
AutoIt|Using AutoIt|Intended Use|
AutoIt|Using AutoIt|Running Scripts|
AutoIt|Using AutoIt|File Name and Path|
AutoIt|Using AutoIt|AutoIt on Windows Vista|
AutoIt|Using AutoIt|Command Line Parameters|
AutoIt|Using AutoIt|Script Editors|
AutoIt|Using AutoIt|Compiling Scripts|
AutoIt|Using AutoIt|AutoIt Window Info Tool (Au3Info)|
AutoIt|Using AutoIt|AutoIt Syntax Checker (Au3Check)|
AutoIt|Using AutoIt|Window Titles and Text (Basic)|
AutoIt|Using AutoIt|Window Titles and Text (Advanced)|
AutoIt|Using AutoIt|Controls|
AutoIt|Using AutoIt|Unicode Support|
etc....
J'aimerais pouvoir sélectionner le TreeView et attendre une retour d'information
quelque chose comme ça ?
If Not ProcessExists('AutoIt3Help.exe') Then ShellExecute("C:\Program Files\AutoIt3\AutoIt.chm")
;se positionne sur le tab Sommaire
Do
$aa = ControlCommand ( "AutoIt Help (v3.3.14.2)", "", "SysTabControl321", "CurrentTab", "")
If $aa <> 1 Then ControlCommand ( "AutoIt Help (v3.3.14.2)", "", "SysTabControl321", "TabLeft", "")
Until $aa = 1
ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "Select", "User Defined Functions Reference|GDIPlus Reference|Font Management|_GDIPlus_FontCreate")
;ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "Select", "#1|#11|#10|#0") ;autre méthode
$aa = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetSelected" , 1)
MsgBox(0,"c'est le chemin",$aa )
$bb= ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", $aa)
MsgBox(0,"le résultat",$bb)
;en attente d'une sélection sur le TreeView de l'aide
Do
$cc = ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetSelected" , 1)
Until $cc <> $aa
;résultat de la sélection
$bb= ControlTreeView ( "AutoIt Help (v3.3.14.2)", "", "SysTreeView321", "GetText", $cc)
MsgBox(0,"le résultat",$bb)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Répondre