[..] Construire un tableau d'après une application

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

[..] Construire un tableau d'après une application

#1

Message 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.
Modifié en dernier par Julien le lun. 29 juin 2009 14:30, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#2

Message 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. ;)
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#3

Message 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
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#4

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#5

Message 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.
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#6

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#7

Message 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
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#8

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#9

Message par Tlem »

Perso, je garderais le pipe et j'utiliserais StringSplit pour séparer les données lorsque j'en ai besoin.
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#10

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#11

Message 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.
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#12

Message 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.
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#13

Message 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. :(
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#14

Message 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
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#15

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Construire un tableau d'après une application

#16

Message 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).
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é".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

Re: [..] Construire un tableau d'après une application

#17

Message 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.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Construire un tableau d'après une application

#18

Message par Tlem »

Voici le début de la réponse :
► Afficher le texte
Il faut évidement adapter ce code à votre besoin. ;)
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é".
Répondre