Page 1 sur 1

Evenements GUI

Posté : jeu. 10 août 2017 12:05
par danylarson
Bonjour,

Est il possible de capturer un événement "je change de valeur" dans une listview (equivalent de onchange en vb).
Si jamais ce n'est pas possible est ce possible que je capture l evenement "j appuie sur entrée" sur une ligne de ma listview

L'idée est d actualiser tout les champs de mon gui quand je selectionne une ligne de ma listview

Si c'est possible pouvez vous me donner un exemple de code ?

Merci pour tout

Re: Evenements GUI

Posté : jeu. 10 août 2017 17:55
par walkson
Bonjour,
Faites une recherche sur GUIListViewEx.au3 (de Melba si je me trompe)
Autrement, pour une "écoute" d'une listview: WM_NOTIFY
Une remarque, en principe, "le bout de gras", c'est celui qui pose la question (son code en exemple) avec son problème. Autrement, il est difficile de vous répondre !

Re: Evenements GUI

Posté : jeu. 10 août 2017 18:44
par mikell
Complément à la réponse de walkson :
On peut touver la liste des notifications pour une Listview dans le fichier d'aide, fonction _GUICtrlListView_Create (par exemple $LVN_ITEMACTIVATE)
Le code d'exemple y est très complet

Re: Evenements GUI

Posté : ven. 11 août 2017 12:23
par danylarson
Merci pour vos Reponses

Alors pour aller plus dans le "gras" voici un code example, qui aidera à mieux cerner mon besoin:
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
    GUICreate("Mon Gui", 440, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)


    Local $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)

    Local $idItem1 = GUICtrlCreateListViewItem("item2|col22|col23", $idListview)
    Local $idItem2 = GUICtrlCreateListViewItem("item1|col12|col13", $idListview)
    Local $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)

        $MonChamp = GUICtrlCreateInput("", 220, 10, 200,30)

    GUISetState(@SW_SHOW)


    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idListview
                MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2)

        EndSwitch
    WEnd
EndFunc   ;==>Example

Et ce que je recherche :

a) en me deplacant au clavier dans ma listview je fait apparaitre dans la textbox ma selection (la ligne entiere de ma listview en bleu)
b) Si la a n'est pas possible je souhaiterais lorsque j'appuie sur entrée faire apparaitre dans ma texte box le contenu de ma selection

Pour le code WM_NOTIFY j'ai besoin d'eviter de m en servir
Pour $LVN_ITEMACTIVATE, je vais voir dans l'aide si je trouve quelque chose d interresant (et bien sur si je trouve tout seul je poste ma solution)

Merci pour tout

Re: Evenements GUI

Posté : dim. 13 août 2017 01:33
par walkson
Bonjour,
Avec la touche Entrée
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
    GUICreate("Mon Gui", 440, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)


    Global $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)

    Local $idItem1 = GUICtrlCreateListViewItem("item2|col22|col23", $idListview)
    Local $idItem2 = GUICtrlCreateListViewItem("item1|col12|col13", $idListview)
    Local $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)

       Global $MonChamp = GUICtrlCreateInput("", 220, 10, 200,30)

    GUISetState(@SW_SHOW)
        HotKeySet ( "{ENTER}" , "listviewread" )

    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idListview
                MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2);réagit sur clic d'entête des colonnes

        EndSwitch
    WEnd
EndFunc   ;==>Example
Func listviewread()
        $AAA = StringReplace(GUICtrlRead(GUICtrlRead($idListview)),"|"," ")
        GUICtrlSetData($MonChamp,$AAA)
EndFunc
Si on utilisait WM_NOTIFY, la touche entrée serait inutile. La simple sélection suffirait.

Re: Evenements GUI

Posté : dim. 13 août 2017 08:53
par mikell
Pour le code WM_NOTIFY j'ai besoin d'eviter de m en servir
Pourquoi diable ?? :shock:

@walkson
Dans ce genre de cas je préfère un accélérateur à une hotkey - surtout pour la touche Enter :?

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
    GUICreate("Mon Gui", 440, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    Global $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)
    Local $idItem1 = GUICtrlCreateListViewItem("item2|col22|col23", $idListview)
    Local $idItem2 = GUICtrlCreateListViewItem("item1|col12|col13", $idListview)
    Local $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)
     Global $MonChamp = GUICtrlCreateInput("", 220, 10, 200,30)

    Local $idUser = GUICtrlCreateDummy()
    Local $aAccelKeys[1][2] = [["{ENTER}", $idUser]]
    GUISetAccelerators($aAccelKeys)

    GUISetState(@SW_SHOW)


    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idListview
                MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2);réagit sur clic d'entête des colonnes
            Case $idUser
                listviewread()

        EndSwitch
    WEnd
EndFunc   ;==>Example

Func listviewread()
        $AAA = StringReplace(GUICtrlRead(GUICtrlRead($idListview)),"|"," ")
        GUICtrlSetData($MonChamp,$AAA)
EndFunc

Re: Evenements GUI

Posté : dim. 13 août 2017 13:13
par walkson
J'ai oublié qu'il y avait plus simple en récupérant les ID des GUICtrlCreateListViewItem()
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
    GUICreate("Mon Gui", 440, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)


    Global $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)

    Local $idItem1 = GUICtrlCreateListViewItem("item2|col22|col23", $idListview)
    Local $idItem2 = GUICtrlCreateListViewItem("item1|col12|col13", $idListview)
    Local $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)

       Global $MonChamp = GUICtrlCreateInput("", 220, 10, 200,30)

    GUISetState(@SW_SHOW)

    ; Loop until the user exits.
    While 1
        $msg = GUIGetMsg()
                Switch $msg
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idListview
                MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2);réagit sur clic d'entête des colonnes
                        Case $idItem1 To $idItem3
                                $valrow = GUICtrlRead($msg)
                                $AAA = StringReplace($valrow,"|"," ")
                                GUICtrlSetData($MonChamp,$AAA)

        EndSwitch
    WEnd
EndFunc   ;==>Example
Case $idItem1 To $idItem3 est valable si tous les items sont construits à la suite
Dans ce cas, un simple clic sur la listview renvoie la valeur
Si les items sont nombreux ou si il y a des rajouts, on peut enregistrer les ID des items dans un array et récupérer les valeurs en faisant Case $array[0] To $array[ubound($array) - 1]
Mais c'est quand même plus simple d'utiliser WM_NOTIFY :P

Re: Evenements GUI

Posté : lun. 14 août 2017 09:30
par danylarson
Merci pour tout !

Je vais tester :)