[..] Selection souris dans _Arraydisplay

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

[..] Selection souris dans _Arraydisplay

#1

Message par waper »

Bonjour à tous,

Je commence à me débrouiller en Autoit, un logiciel pour ma société est actuellement en production et je lui rajoute des fonctions, ici nous sommes sur le retour d'une recherche par nom d'un client.

Je fait le retour dans un _ArrayDisplay (je n'ai jamais fait ce type de fonction je tâtonne et je pense que ce n'est pas la meilleure solution). Actuellement cela fonctionne j'ai ma fenêtre principal et lors de la recherche une seconde fenêtre s'ouvre avec la liste des résultats trouvé (le _Arraydisplay).
Je voudrais plutôt que de mémorisé le code client et le retaper dans la fenêtre principal pouvoir le sélectionner via un double clic par exemple, fermer la fenêtre secondaire et alimenter une de mes zone de ma Gui principale avec la valeur récupérée.

Je travaille avec une base de donnée mdb et la recherche est en fait une requête sql :
$query = "SELECT * FROM " & $tblname & " WHERE Nom LIKE '%" & GUICtrlRead($clientNom) & "%'"

et le classique pour la conenxion à la base :
$adoCon = ObjCreate("ADODB.Connection")
$adoCon.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $dbname)

Mon array :
$rgrid = $adoRs.GetRows()
$r_number = UBound($rgrid)
_ArrayDisplay($rgrid, "Résultat clients", "|0:23", 32 + 64, Default, "AA|BB|CC|DD", Default, 0xDDFFDD)
$adoCon.Close

Je pense qu'il ne faut pas que j'utilise un _ArrayDisplay seul car cette fonction est je pense trop cloisonnée et pas forcement faite pour ça mais je ne voit pas trop comment faire.

Merci d'avance pour votre aide !

PS : Je cache les boutons car je souhaite que les utilisateur puisse faire leur sélection à la souris.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#2

Message par orax »

Je ne pense pas que la fonction ArrayDisplay soit adaptée. Dans un premier temps, à la place d'exécuter ArrayDisplay, il faudrait créer une seconde GUI avec une ListView qui sera remplie avec les résultats de la requête SQL ($rgrid) ; c'est d'ailleurs ce que fait ArrayDisplay. C'est cette seconde GUI qui s'occupera de gérer le double clic sur un élément de la ListView.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#3

Message par waper »

Alors, j'ai essayé de faire un listview mais il est vide, du coup c'est là que j'ai besoin d'exemple précis.
J'ai ceci :
$rgrid = $adoRs.GetRows()
      $r_number = UBound($rgrid)
      $GUIlist = GUICreate("Résultat clients", 800, 600, 100, 100, -1)
      Local $listview = GUICtrlCreateListView("Test", 10, 10, 200, 150)
      Local $iditemlist = GUICtrlCreateListViewItem($rgrid, $listview)
      GUISetState(@SW_SHOW)
      Local $aMsg = 0
          While 1
            $aMsg = GUIGetMsg(1)
            Switch $aMsg[0]
               Case $GUI_EVENT_CLOSE
                  GUIDelete($GUIlist)
                  ExitLoop
            EndSwitch
         WEnd
      $adoCon.Close
Là j'ai un grand tableau (ma $GuiList) avec un petit dedans, à la limite les taille on s'en fou lol mais juste le mot test apparait :/
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#4

Message par waper »

Alors j'ai essayé un peu d'avancer sur le sujet, toujours bloqué avec le code suivant :
$rgrid = $adoRs.GetRows()
      $r_number = UBound($rgrid)
      $GUIlist = GUICreate("Résultat clients", 800, 600, 100, 100, -1)
      $listview = GUICtrlCreateListView("1col|2col|3col", 10, 10, 200, 150)
      For $i = 1 To UBound($rgrid) - 1
         GUICtrlCreateListViewItem($rgrid[$i] & "|" & $rgrid[$i] & "|" & $rgrid[$i],$listview)
         ;GUICtrlCreateListViewItem($i & "|" & $i & "|" & $i,$listview)
      Next
      ;Local $iditemlist = GUICtrlCreateListViewItem($rgrid, $listview)
      GUISetState(@SW_SHOW)
      Local $aMsg = 0
          While 1
            $aMsg = GUIGetMsg(1)
            Switch $aMsg[0]
               Case $GUI_EVENT_CLOSE
                  GUIDelete($GUIlist)
                  ExitLoop
            EndSwitch
         WEnd
      $adoCon.Close
J'ai une erreur :
==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
GUICtrlCreateListViewItem($rgrid[$i] & "|" & $rgrid[$i] & "|" & $rgrid[$i],$listview)
GUICtrlCreateListViewItem(^ ERROR

Ma vairable $r_number renvoi bien le nombre de ligne du résultat de la requête, pour le test 34 exactement d'où mon $i de 1 à 34 on vas dire mais je ne voit pas trop comment remplir cette listview.
Du coup je me demande, est-ce parce que je n'ai mis que trois colonne pour tester et qu'il en attend X (nombre de colonne sur ma requête) et qu'il plante ou que j'utilise mal ma variable $rgrid qui je suppose est un Array... pourtant en l'affichant avec un _ArrayDisplay mon $rgrid rempli bien le tableau... bref je séche.
Merci de votre aide.
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: [..] Selection souris dans _Arraydisplay

#5

Message par walkson »

Bonjour,
essayez celà
$rgrid = $adoRs.GetRows()
_ArrayDisplay($rgrid)
je pense que vous devez retrouver un array avec plusieurs colonnes
Si c'est le cas $rgrid[$i] est faux. il devrait être $rgrid[$i][$y] car vous êtes sur un array 2D
Autre chose aussi, vérifiez si les données commencent en ligne 0 ou 1
si elles commencent en ligne 0 il faut For $i = 0 To UBound($rgrid) - 1
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#6

Message par waper »

Merci pour la réponse, je vais essayé avec la méthode 2D.
Concernant _Array($rgrid) il fonctionne parfaitement mais comme je l'indique dans mon premier poste une fois le tableau des résultat apparu je voudrais que les utilisateurs puissent double cliquer sur une ligne et ainsi sélectionner la valeur et le _ArrayDisplay étant cloisonné on m'as conseillé éun listview, aprés si je peux le faire dans _ArrayDisplay ça m'arrangerais lol :D
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#7

Message par waper »

Eureka, j'ai des donnée !
du coup $rgrid[$i][$y] était la solution à mon probléme, le fameux 2D, par contre le premier chiffre c'est la ligne et le second la colonne ?

J'anticipe ensuite, dans ma list view comment mettre le fond d'une ligne sur deux en surbrillance, comment permettre à l'utilisateur de faire un tris sur les colonnes, et le fameux clic droit actif car dans ma GUI mon clic droit est anatif.
Merci de vos aides :)
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: [..] Selection souris dans _Arraydisplay

#8

Message par walkson »

un exemple d'utilisation
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>
Local $aArray[16][5]
For $i = 0 To 15
    For $j = 0 To 4
        $aArray[$i][$j] = "#" & $i & $j
    Next
Next

;dans votre cas si $rgrid est array 2D
;$rgrid = $adoRs.GetRows()
;$aArray = $rgrid
_ArrayDisplay($aArray)
            $r_col = UBound($aArray,2) - 1;colonnes
         Local $colonne
         For $i = 0 To $r_col;enregistre colonnes
            $colonne &= "colonne " & $i & "|"
         Next

            $GUIlist = GUICreate("2 D", 500, 500, 100, 100, -1)
            Local $listview = GUICtrlCreateListView($colonne, 10, 10, 400, 400)
         GUICtrlSetBkColor(-1, 0xccffff)
         GUICtrlSetBkColor($listview, $GUI_BKCOLOR_LV_ALTERNATE)
            Local $val
         Local $item[UBound($aArray,1)];stock item ID dans un array soit un ID par ligne
         For $i = 0 To UBound($aArray,1) - 1;lignes
            For $j = 0 To $r_col ;récup valeurs colonnes sur ligne $i
            $val &= $aArray[$i][$j] & "|"
            Next
             $item[$i]  = GUICtrlCreateListViewItem($val, $listview);écriture ligne
             GUICtrlSetBkColor(-1, 0xffffcc)
            $val = "";on vide variable pour ligne suivante
         Next
         GUICtrlCreateLabel("cliquez sur un item",10,450,400,30)
         GUICtrlSetFont(-1,15)
         $label = GUICtrlCreateLabel("",100,420,300,30)
         GUICtrlSetFont(-1,15)
            GUISetState(@SW_SHOW)
                While 1
                    $aMsg = GUIGetMsg()
                    Switch $aMsg
                        Case -3
                            GUIDelete($GUIlist)
                            ExitLoop
                  Case $item[0] To $item[UBound($aArray,1) - 1]
                     $valrow = GUICtrlRead($aMsg);lecture de la ligne #01|#02|#03......
                     $split = StringSplit($valrow,"|")
                     $concatene = ""
                     For $a = 1 To $split[0];$split[0]= nb enregistrements
                        $concatene &= $split[$a] & "  ";récupère valeurs sans "|"
                     Next
                     GUICtrlSetData($label,$concatene)
                     ;autre possibilité
                     ;GUICtrlSetData($inputnom,$split[1])
                     ;GUICtrlSetData($inputadresse,$split[2])
                     ;GUICtrlSetData($inputville,$split[3]) etc....
                    EndSwitch
                WEnd
Pour trier les colonnes, voir _GUICtrlListView_SortItems() ou _GUICtrlListView_SimpleSort() dans l'aide
ou plus simple
$query = "SELECT * FROM " & $tblname & " WHERE Nom LIKE '%" & GUICtrlRead($clientNom) & "%' ORDER BY Nom ASC;"
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
waper
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 06 oct. 2015 12:43
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#9

Message par waper »

Merci pour l'ensemble de l'aide j'ai pu résoudre par contre pour que ce soit le double clic qui fonctionne pas moyen... j'ai dû utiliser la touche entrée.

Pour les intéressé voici le code :
$rgrid = $adoRs.GetRows()
      $r_number = UBound($rgrid)
      $GUIlist = GUICreate("Résultat clients", 1000, 600, 100, 100, $WS_OVERLAPPEDWINDOW) ;BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN)
      $listview = GUICtrlCreateListView("Code|Identifiant|Nom|Numéro de rue|Nom de rue|Complement|Code Postal|Ville|Téléphone", 10, 10, 980, 580, -1)
      For $i = 0 to $r_number - 1
         if Mod($i, 2) = 0 Then ; pour savoir si nombre impair ou pair et colorer une ligne sur deux en 0xFFDDDD
         GUICtrlCreateListViewItem($rgrid[$i][0] & "|" & $rgrid[$i][1] & "|" & $rgrid[$i][6] & "|" & $rgrid[$i][11] & "|" & $rgrid[$i][13] & "|" & $rgrid[$i][14] & "|" & $rgrid[$i][17] & "|" & $rgrid[$i][18] & "|" & $rgrid[$i][20],$listview)
      Else
         GUICtrlCreateListViewItem($rgrid[$i][0] & "|" & $rgrid[$i][1] & "|" & $rgrid[$i][6] & "|" & $rgrid[$i][11] & "|" & $rgrid[$i][13] & "|" & $rgrid[$i][14] & "|" & $rgrid[$i][17] & "|" & $rgrid[$i][18] & "|" & $rgrid[$i][20],$listview)
         GUICtrlSetBkColor(-1, 0xFFDDDD)
      EndIf
      Next
      GUISetState(@SW_SHOW)
      Local $aMsg = 0
          While 1
            $aMsg = GUIGetMsg(1)
            $Indice = _GUICtrlListView_GetSelectedIndices($ListView) ; récupere l'indice de la ligne sélectionné
            $Item = _GUICtrlListView_GetItem($ListView,int($Indice),0); Le 0 permet de recuperer dans la colonne 1

            $StateWin = WinGetState("Résultat clients") ;sans ça la touche entrée s'exécute de partout....
            If _IsPressed("0D", $hDLL) And BitAND($StateWin, 8) Then
               Global $ccliselect = $Item[3]
               GUIDelete($GUIlist)
               ExitLoop
            EndIf
            Switch $aMsg[0]
               Case $GUI_EVENT_CLOSE
                  GUIDelete($GUIlist)
                  ExitLoop
            EndSwitch
         WEnd
      $adoCon.Close
      GUICtrlSetData($CodeClient,$ccliselect)
      Call("searchcode")
Si quelqu'un sait comment fait un genre de "_IsPressed("0D", $hDLL) And BitAND($StateWin, 8) Then" mais qui prend en charge le double clic et si on peu les intégrer facilement dans le code je prend.
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 128
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [..] Selection souris dans _Arraydisplay

#10

Message par Numeric »

De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
Répondre