Page 1 sur 1
[..] Construire un tableau d'après une application
Posté : jeu. 14 mai 2009 18:53
par Julien
Bonsoir,
J'ai une application (pas autoit) dans laquelle sur la gauche j'ai un espèce de menu, au dessus des espèces d'onglet et dans le cadre central un tableau sous la forme :
N° Aléatoire | texte | texte | texte |
-----------------------------------
N° Aléatoire | texte | texte | texte |
-----------------------------------
N° Aléatoire | texte | texte | texte |
-----------------------------------
N° Aléatoire | texte | texte | texte |
-----------------------------------
N° Aléatoire | texte | texte | texte |
-----------------------------------
Ce qui m'intéresse dans ce tableau c'est la colonne N° Aléatoire, qui une fois rafraichie peux accueillir de nouveau numéro mais aussi en faire disparaitre. C'est un gestionnaire de tickets d'incident.
Question : est il possible de construire un array des N° Aléatoire et de lancer une action en fonction du nombre de modifications de cet array ?
A quoi je pense, (en code avec commentaires pour faire plus simple):
Code : Tout sélectionner
Global $nbTotal = 0 ; Initialisation du nombre total de ligne
Global $array_total ; Initialisation du tableau lors de la première exécution
Global $texte_splash ; Initialisation du texte pour splash en fin de boucle
While 1
; Actualisation dans le logiciel pour mettre le tableau à jour
; Ajout dans array_total tout les N° (1 fois)
; Ajout dans array_now tout les N°
; Comparaison du array_total avec array_now
; Si un N° est ajouté
; Action 1
; Si un N° est absent
; Action 2
; Si un N° est ajouté et un autre est absent
; Action 3
; Si pas de différence
; Action 4
; Affichage d'un splash résumé
Sleep(10000) ; Petite pause de 10 secondes
wend
; Action 1 (modèle)
Func Action1()
Beep(500, 1000)
$texte_splash = "X dossiers ajouté : " ; + la liste
EndFunc
Évidement c'est plus facile à comprendre pour moi mais est-ce compréhensible ?
Je pense que je suis capable de faire une grosse partie (quoique... pas encore trop d'assurance avec autoit, mais j'use l'aide!) cependant je ne parviens pas à concrétiser la façon de capture les N° pour en faire ne serait-ce que pour les mettre à la suite ! (dans msgbox par Ex.)
Si vous pouviez m'éclairer sur une façon d'attaquer.
D'avance merci.
Re: [...] Construire un tableau d'après une application
Posté : jeu. 14 mai 2009 21:07
par Tlem
La récupération des informations de votre cadre central, représente sans doute 60/75% de ce qu'il y à faire.
Regardez si avec AutoIt Windows Info vous pouvez avoir des informations, ou comment récupérer le texte de cette zone.
Une fois ceci fait, on pourra aller plus loin.

Re: [...] Construire un tableau d'après une application
Posté : ven. 15 mai 2009 08:18
par Julien
Bonjour,
Alors avec Autoit Info j'ai ceci, (cela concerne) le carré central dans lequel j'ai le tableau :
>>>> Window <<<<
Title: Titre de le fenêtre !
Class: SWT_Window0
Position: -4, -4
Size: 1288, 1004
Style: 0x97CF0000
ExStyle: 0x00100100
Handle: 0x00040468
>>>> Control <<<<
Class: SysListView32
Instance: 1
ClassnameNN: SysListView321
Advanced (Class): [CLASS:SysListView32; INSTANCE:1]
ID: 198054
Text:
Position: 267, 147
Size: 994, 763
ControlClick Coords: 600, 50
Style: 0x5611004D
ExStyle: 0x00100200
Handle: 0x000305A6
>>>> Mouse <<<<
Position: 867, 235
Cursor ID: 0
Color: 0xFFFFFF
En texte caché je n'ai que le premier N°, y'a t'il une fonction de recherche de caractère ou de parcours de tableau ? même visuel ? (tout mes N° commence par la même lettre)
Merci
Re: [...] Construire un tableau d'après une application
Posté : ven. 15 mai 2009 12:28
par Julien
Après quelques lectures je me suis attardé sur la doc AutoIT à l'index GUICtrlCreateListView qui donne un bon exemple (à mon avis) de ce que je veux faire.
D'après l'exemple :
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
GUISetState()
GUICtrlSetData($item2, "ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
Ce que je voudrais faire pour mes N° c'est faire un array des Item contenu dans la colonel col1. Ca devrait être plus clair comme cela.
Ceci dit, ça à l'aire plutôt simple (je dis ça mais j'ai pas essayé encore) avec cet exemple car j'ai la source or je dois appliquer cela à un logiciel tiers.
En espérant que les détails aident.
Re: [...] Construire un tableau d'après une application
Posté : ven. 15 mai 2009 22:47
par Tlem
Avant d'imaginer la suite, essayez de trouver une solution pour récupérer le texte de ce ListView, car si ce n'est pas possible, il n'y à aucun intérêt de se casser la tête pour aller plus loin.
Re: [...] Construire un tableau d'après une application
Posté : dim. 17 mai 2009 19:47
par Julien
Bonsoir,
Je n'ai pas l'application le week-end, sur laquelle je voudrais utiliser ce script. Ceci dit j'ai essayé ce week-end en faisant un test mais je ne parviens à rien.
J'ai repris l'exemple de l'aide pour simuler mon appli du boulot, donc je l'ai compilé, j'ai fait une autre "appli" compilée pour essayé de récupérer le contenu de ma colonne 1 mais même ça je n'y arrive pas. Je ne sais pas comment my prendre pour "attaquer" une application à partir d'une autre.
Par contre juste avec l'exemple j'y suis arrivé (de façon simple, sans array) mais j'ai la source du programme.
Tlem, auriez-vous un tuyau pour avancer ?
D'avance merci.
Re: [...] Construire un tableau d'après une application
Posté : dim. 17 mai 2009 22:15
par Tlem
Je viens d'y passer un petit moment, car en fouillant le forum Anglais j'ai trouvé une fonction :
_CtrlGetByPos.au3 qui permettait de récupérer le handle d'un contrôle par des coordonnées.
Après un bon moment, j'ai réussi à faire fonctionner le script, mais je me suis rendu compte qu'il suffisait tout simplement de récupérer le handle, puis d'utiliser des fonction ListView.
Donc nouvelle recherche dans la doc après une fonction qui récupère le handle d'un contrôle. Et paf ... dans le mille avec
ControlGetHandle.
Voici donc un bout de code qui récupère le texte du SysListView créé par le code que vous avez posté plus haut :
Code : Tout sélectionner
#include <GuiListView.au3>
Dim $hCtrl, $CountItem, $i, $ListItem
$hCtrl = ControlGetHandle("listview items", "", "[CLASS:SysListView32]")
$CountItem = _GUICtrlListView_GetItemCount($hCtrl) ; récupère le nombre d'élément du listview.
For $i = 0 To $CountItem - 1 ; boucle sur le nombre d'élément.
$ListItem = $ListItem & _GUICtrlListView_GetItemTextString($hCtrl, $i) & @CRLF ; récupération du texte.
Next
MsgBox(0, "", $ListItem) ; affichage de la liste des éléments.
Pour archive, au cas ou la fonction
_CtrlGetByPos deviendrait nécessaire, je la met ci-dessous :
► Afficher le texte_CtrlGetByPos
Code : Tout sélectionner
;===============================================================================
; Function Name: _CtrlGetByPos()
; Description: Get the Control ID or the ClassNameNN by the X and Y client coordinates
; Syntax: _CtrlGetByPos("Window Title", [Control Text], [X Client Coord], [Y Client Coord], [Return Type])
;
; Parameter(s): $hWin = Window Name or Handle
; $sText = Text of the Control
; $iXPos = X Client Coord
; $iYPos = Y Client Coord
; $iReturnType = Return type (default = 0 (ClassNameNN))
; 0 = ClassNameNN
; 1 = Control ID
; 2 = Control Handle
; 3 = All 3 ClassNameNN, Control ID, Control Handle
;
;
; Requirement(s): External: = None.
; Internal: = AutoIt Beta 3.1.130 (or which ever release SetError(0,0,0) was introduced)
;
; Return Value(s): On Success: = Returns Array List
; On Failure: = @error 1 (Control was found but there was an error with the DLLCall)
; On Failure: = @error 2 (No classes were found)
;
; Author(s): SmOke_N
;
; Note(s): Similar to LxP's here (This was made before I remembered he had done something similar)
; http://www.autoitscript.com/forum/index.php?showtopic=14323&hl=
;
;
; Example(s):
; Opt('WinTitleMatchMode', 4)
; _CtrlGetByPos('classname=SciTEWindow', '', 829, 504, 2)
;===============================================================================
Func _CtrlGetByPos($hWin, $sText = '', $iXPos = 0, $iYPos = 0, $iReturnType = 0)
If IsString($hWin) Then $hWin = WinGetHandle($hWin)
Local $sClassList = WinGetClassList($hWin), $hCtrlWnd
Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF), $aReturn = ''
For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
Local $nCount = 0
While 1
$nCount += 1
Local $aCPos = ControlGetPos($hWin, $sText, $sSplitClass[$iCount] & $nCount)
If @error Then ExitLoop
If $iXPos >= $aCPos[0] And $iXPos <= ($aCPos[0] + $aCPos[2]) _
And $iYPos >= $aCPos[1] And $iYPos <= ($aCPos[1] + $aCPos[3]) Then
If $sSplitClass[$iCount] <> '' And Not $iReturnType Then
Local $aClassNN[2] = [2, $sSplitClass[$iCount] & $nCount]
Return $aClassNN
EndIf
If $sSplitClass[$iCount] <> '' And $iReturnType = 3 Then
$hCtrlWnd = ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
ControlFocus($hWin, $sText, $hCtrlWnd)
$aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
If @error = 0 And $aReturn[0] <> '' Then
Local $aClassNN[4] = [4, $aReturn[0], $sSplitClass[$iCount] & $nCount, $hCtrlWnd]
Return $aClassNN
EndIf
Local $aClassNN[2] = [2, $sSplitClass[$iCount] & $nCount]
Return $aClassNN
ElseIf $sSplitClass[$iCount] <> '' And $iReturnType = 2 Then
Return ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
ElseIf $sSplitClass[$iCount] <> '' And $iReturnType = 1 Then
$hCtrlWnd = ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
ControlFocus($hWin, $sText, $hCtrlWnd)
$aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
If @error = 0 And $aReturn[0] <> '' Then
Local $aClassNN[2] = [2, $aReturn[0]]
Return $aClassNN
EndIf
EndIf
Return SetError(1, 0, 0)
EndIf
WEnd
Next
Return SetError(2, 0, 0)
EndFunc
Re: [...] Construire un tableau d'après une application
Posté : lun. 18 mai 2009 16:40
par Julien
Merci.
Alors pour ce nouveau test j'ai en effet le contenu complet de mon tableau dans ma msgbox !! c'est déjà un super début !
Les colonnes sont séparés par un pipe | je vais voir comment le découper simplement et le mettre dans mon array.
Merci.
Re: [...] Construire un tableau d'après une application
Posté : lun. 18 mai 2009 20:26
par Tlem
Perso, je garderais le pipe et j'utiliserais StringSplit pour séparer les données lorsque j'en ai besoin.
Re: [...] Construire un tableau d'après une application
Posté : mar. 19 mai 2009 11:03
par Julien
petite question,
n'est il pas possible d'isoler les items de la première colonne simplement ? il n'existe pas une fonction autoit spécifique ? (je suis dans la doc depuis hier pour découper mon texte)
le problème que je rencontre avec StringSplit c'est qu'il n'y à pas de "pipe" à la fin des ligne donc le 1er item des lignes est précédé du dernier item de la ligne précédente.
bref je ne parviens pas à récupérer uniquement les items de la col1.
Sinon avec une boucle for et un regex pour trouver mes N° qui ont tous la forme JXXXXXX (X étant un chiffre), c'est pas très optimisé à mon avis.
Re: [...] Construire un tableau d'après une application
Posté : mar. 19 mai 2009 17:09
par Tlem
Si seul l'élément de la première colonne vous intéresse, alors utilisez plutôt
_GUICtrlListView_GetItemText.
Tapez
_GUICtrlListView dans l'aide pour avoir toutes les fonctions liées aux ListView, ou
_GUICtrlListView_Get pour affiner la recherche sur la récupération d'infos d'un ListView, ou encore
_GUICtrlListView_GetItem pour affiner encore un peut sur la récupération d'infos concernant un Item.
L'aide d'AutoIt est riche en information et coder un script sans même utiliser l'aide me parait impensable.
Re: [...] Construire un tableau d'après une application
Posté : mar. 19 mai 2009 17:31
par Julien
Je suis entièrement d'accord, d'ailleurs j'ai passé une bonne partie de la matinée à faire des test avec l'aide mais mon boulot à pris le dessus, c'est pourquoi mon message précédent n'est pas complet (je l'ai écrit sur environ 3 heures). je crois que je verrais la semaine prochaine.
Merci pour l'aide, je repasserais ici pour dire ce qu'il en est.
Re: [...] Construire un tableau d'après une application
Posté : dim. 07 juin 2009 12:10
par Julien
Bonjour,
Merci pour votre aide. J'arrête ce bout de code pour le moment. L'application en question va être mise à jour d'ici quelques semaines et en version web. J'ai déjà vu l'interface et ça va être encore plus drôle à faire.

Re: [...] Construire un tableau d'après une application
Posté : lun. 29 juin 2009 14:43
par Julien
Bonjour,
Je me relance car finalement la nouvelle version n'est pas prête.
Donc j'en suis au stade ou j'ai dans un array le contenu de la première colonne pour chaque ligne, avec ceci :
Code : Tout sélectionner
#include <GuiListView.au3>
#include <Array.au3>
Dim $hCtrl, $CountItem, $i, $ListItem
Local $Window = "logiciel super !"
$hCtrl = ControlGetHandle($Window, "", "[CLASS:SysListView32]")
$CountItem = _GUICtrlListView_GetItemCount($hCtrl) ; récupère le nombre d'élément du listview.
$CountItem = $CountItem - 1
Local $avArray[$CountItem]
For $i = 0 To $CountItem - 1 ; boucle sur le nombre d'élément.
$ListItem = _GUICtrlListView_GetItemText($hCtrl, $i); récupération des numéro de dossier
$avArray[$i] = $ListItem
Next
_ArrayDisplay($avArray, "$avArray BEFORE _ArrayAdd()")
ce qui me donne : (copie du _ArrayDisplay)
[0]|AAA1620A
[1]|AAA1586A
[2]|AAA1457B
[3]|AAA1405B
[4]|AAA0567B
[5]|AAA0265B
[6]|AAA0138B
[7]|AAA9447B
[8]|AAA3495C
[9]|AAA1416C
j'ai bien tout mes numéros de dossiers.
Je compte rafraichir cette liste toute les 2 minutes (environs)
Existe t-il un moyen simple (fonction intégrée) pour faire une comparaison des tableaux. Par exemple, après le 1er rafraichissement je stock le précédent résultat. 2 minutes plus tard je réactualise et j'obtiens le tableau suivant :
[0]|AAA1620A
[1]|AAA1586A
[2]|AAA1457B
[3]|AAA1405B
[5]|AAA0265B
[6]|AAA0138B
[7]|AAA9447B
[8]|AAA3495C
[9]|AAA1416C
[10]|AAA1417C
On constate le la ligne 4 à disparu et que la ligne 10 est apparue.
Je vaudrais qu'après comparaison il me signale (par msgbox par ex) qu'un nouveau dossier est présent et qu'un dossier à disparu
Re: [...] Construire un tableau d'après une application
Posté : mer. 01 juil. 2009 13:22
par Julien
bonjour,
je ne trouve pas d'information sur google pour la comparaison de array, à votre avis la façon de m'y prendre n'est pas la bonne ?
merci
Re: [...] Construire un tableau d'après une application
Posté : mer. 01 juil. 2009 16:11
par Tlem
Il n'existe pas de solution intégrée pour faire ce genre de chose.
Mais vu que le nombre d'éléments n'est pas trop important, vous pourriez prévoir les choses avec 3 tableaux.
Le tableau en cours (T1), le tableau en cours - 1 (T2) et un tableau de différences (T3).
Le but serait de faire après chaque rafraîchissement une lecture du tableau T1 éléments par éléments et de comparer chaque élément à un élément de T2.
Ce qui donnerait schématiquement :
- T1[1] comp T2[1]
- T1[2] comp T2[1]
- T1[3] comp T2[1]
- ...
- T1[1] comp T2[2]
- T1[2] comp T2[2]
- T1[3] comp T2[2]
- ...
- T1[1] comp T2[3]
- T1[2] comp T2[3]
- T1[3] comp T2[3]
Pour chaque élément nouveau ou supprimé on met à jour T3 avec une info qui permet de savoir si l'élément a été ajouté ou supprimé (sinon il faut travailler sur un tableau à deux dimensions).
Re: [..] Construire un tableau d'après une application
Posté : mer. 08 juil. 2009 11:38
par Julien
Bonjour Tlem, je colle brute ce que j'ai essayé de réaliser, je m'enlise complétement avec les Array. Je travaill essentiellement avec l'aide et des exemple que j'ai trouvé via google mais cela ne me convient pas.
Si vous aviez un peu de temps. D'avance merci.
Code : Tout sélectionner
#include <GuiListView.au3>
#include <Array.au3>
Dim $hCtrl, $CountItem, $i, $ListItem
Local $Window = "ma fenêtre"
Global $start = 0
$hCtrl = ControlGetHandle($Window, "", "[CLASS:SysListView32]")
$CountItem = _GUICtrlListView_GetItemCount($hCtrl) ; récupère le nombre d'élément du listview.
$CountItem1 = _GUICtrlListView_GetItemCount($hCtrl) ; récupère le nombre d'élément du listview.
Global $avArray[$CountItem]
Global $cnt = $CountItem
Global $avArray1[$CountItem]
Global $cnt1 = $CountItem
Global $cnt3
Global $i3 = 0
$i = 0
While $i <= ($CountItem - 1)
If $start = 0 Then
$ListItem = _GUICtrlListView_GetItemText($hCtrl, $i); récupération des numéro de dossier
$avArray[$i] = $ListItem
EndIf
$i = $i + 1
WEnd
$start = 1
$i = 0
While $i <= ($CountItem1 - 1)
$ListItem = _GUICtrlListView_GetItemText($hCtrl, $i); récupération des numéro de dossier
$avArray1[$i] = $ListItem
$i = $i + 1
WEnd
_ArrayDelete($avArray, 8) ; pour rentrer dans la condition suivante [TEST]
$cnt = $cnt - 1 ; pour rentrer dans la condition suivante [TEST]
If $cnt <> $cnt1 Then
If $cnt > $cnt1 Then
$cnt3 = $cnt
Else
$cnt3 = $cnt1
EndIf
Global $avArray3[$i3][$i3]
$i = 0
While $i3 <= $cnt3
If $avArray[$i] <> $avArray1[$i] Then
$avArray3[$i] = $avArray[$i]
_ArrayAdd($avArray, "Brian")
EndIf
$i3 = $i3 + 1
WEnd
$start = 0
EndIf
MsgBox(0, "Value of $i is:", $cnt & " - " & $cnt1)
;~ MsgBox(0, "", $CountItem & " - " & $avArray[0]) ; affichage de la liste des éléments.
_ArrayDisplay($avArray, "T1") ; T1
_ArrayDisplay($avArray1, "T2") ; T2
_ArrayDisplay($avArray3, "T3", -1, 1) ; T3
normalement je devrais ajouter à T3 (array 2D) les données "en différences" par rapport à T1 et T2.
Re: [..] Construire un tableau d'après une application
Posté : ven. 17 juil. 2009 02:23
par Tlem
Voici le début de la réponse :
► Afficher le texte
Code : Tout sélectionner
#include <GuiListView.au3>
#include <Array.au3>
Dim $Array1, $Array2, $Array3[1]
Local $Array1[10] = ["AAA1620A", "AAA1586A", "AAA1457B", "AAA1405B", "AAA0567B", "AAA0299B", "AAA0138B", "AAA9447B", "AAA3495C", "AAA1416C"]
Local $Array2[10] = ["AAA1620A", "AAA1586A", "AAA1457B", "AAA1405B", "AAA0265B", "AAA0138B", "AAA9447B", "AAA3495C", "AAA1416C", "AAA1417C"]
;If IsArray($Array1) Then $Array2 = $Array1 ; A utiliser pour mémoriser le tableau 1 dans le tableau 2.
If IsArray($Array1) and IsArray($Array2) Then
For $i = 0 To Ubound($Array1) - 1
$Flag = 0
For $j = 0 To Ubound($Array2) - 1
If $Array1[$i] = $Array2[$j] Then $Flag = 1
Next
If $Flag = 0 Then _ArrayAdd($Array3, $Array1[$i] & " Ajouté")
Next
For $i = 0 To Ubound($Array2) - 1
$Flag = 0
For $j = 0 To Ubound($Array1) - 1
If $Array2[$i] = $Array1[$j] Then $Flag = 1
Next
If $Flag = 0 Then _ArrayAdd($Array3, $Array2[$i] & " Supprimé")
Next
EndIf
_ArrayDisplay($Array3,"")
Il faut évidement adapter ce code à votre besoin.
