Page 1 sur 1

[..] Cliquer sur une cellule de listview

Posté : lun. 01 août 2011 16:42
par yop73
Bonjour,

Pas moyen de trouver comment cliquer sur une cellule spécifique d'un listview pour en sortir la valeur et la remplacer.

En fait, je veux pouvoir cliquer sur une cellule et la griser.
Ce qui ouvre une petite fenêtre ou inputbox pour modifier la valeur de la cellule et la remplacer pour la sauvegarder.

J'ai cherché sur les forums français et anglais sans succès.
Merci de votre aide si vous pouvez m'aiguiller.

Re: [..] Cliquer sur une cellule de listview

Posté : lun. 01 août 2011 17:34
par PandiPanda
ceci devrai vous convenir;
_GUICtrlListView_ClickItem()

ainsi que ceci; GuiListView management

Re: [..] Cliquer sur une cellule de listview

Posté : lun. 01 août 2011 20:42
par zeshrek
Yop, t'as pas l'impression d'abuser là ?
C'est trop compliqué de regarder l'aide à GUICtrlCreateTreeView et lire l'exemple qui est fourni ?



Ca m'énerve... ca... ca m'énerve ! (c) J-P Bacri

Re: [..] Cliquer sur une cellule de listview

Posté : lun. 01 août 2011 23:13
par ZOTHOP
zeshrek a écrit :Yop, t'as pas l'impression d'abuser là ?
C'est trop compliqué de regarder l'aide à GUICtrlCreateTreeView et lire l'exemple qui est fourni ?



Ca m'énerve... ca... ca m'énerve ! (c) J-P Bacri

Il y en a qui ne sont pas capable de se casser la tête pendant une semaine ou deux sur un problème en se débrouillant tout seul.
En lisant bien l'aide de l'Autoit ( il ne faut pas se contenter de l'aide sur la fonction que l'on cherche à maîtriser, d'autres fonctions peuvent aider au résultat escompté ), en faisant ses propres expériences, en observant beaucoup, en apprenant autant de ses réussites que de ses erreurs, on finit par y arriver avec beaucoup de ténacité. On fixe mieux ses connaissances ainsi.
J'ai mis une bonne semaine pour arriver au résultat que l'on peut voir dans ce tuto : http://www.autoitscript.fr/forum/viewto ... =11&t=8047
Sans demander d'aide, j'y ai laissé quelque neurones quand même ! :lol:

Re: [..] Cliquer sur une cellule de listview

Posté : mer. 03 août 2011 10:26
par yop73
Bonjour à tous,

Tout le monde ne travaille pas 35 heures par semaine et j'avoisine les 70 pour ma part.
Je n'ai effectivement pas le temps de "me taper" toutes les fonctions plus ou moins ressemblantes et je n'ai pas non plus de formation de programmation.
Et en posant une question simple, je ne m'attendais pas à me faire aboyer dessus.
Même par un ogre.......

la lecture approfondie de la fonction GUICtrlCreateTreeView ne m'apprend pas à sélectionner et griser une seule cellule.
J'avoue me prendre dans les paramètres de style du listview.

Espérant ne pas me faire mordre, merci d'avance pour votre aide.

Re: [..] Cliquer sur une cellule de listview

Posté : mer. 03 août 2011 16:53
par ZOTHOP
Je signale que je ne suis pas programmeur, je suis chef de rayon dans un supermarché et je fais aussi des heures de dingue ( heureusement, je suis actuellement en congés :D ) ! J'ai l'habitude de me débrouiller seul dans mon coin car je suis de la vieille école, j'ai connus des ordinateurs à une époque où on devait se débrouiller seul car il n'existait pas Internet et, de ce fait, pas de forums de discussion pour profiter de l'expérience des autres, Il fallait se débrouiller avec deux trois copains ou des clubs informatiques, à conditions qu'ils avaient le même ordinateur ou le même langage.

Si il n'existe pas de documentation sur les ListView ni en anglais ni en Français, on va devoir se débrouiller nous même en apprenant de nos expériences.

Ca fait deux heures et demi que je planche sur comment sélectionner une cellule d'un ListView et récupérer ses données, Je n'ai réussi pour le moment qu'à trouver le moyen d'éditer une cellule, par contre sa valeur ne se modifie pas quand on appuie sur Enter .

Code : Tout sélectionner

$ListView1 = GUICtrlCreateListView(" ", 152, 8, 313, 361, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_EDITLABELS)) ; --->>> $LVS_EDITLABELS
 
Dans le ListView, cliquez sur un item plusieurs fois et il se transformera de manière à ce que vous puissiez taper une valeur directement à l'intérieur, mais dans l'état actuel des choses, la valeur initiale ne se modifiera pas !

Ce n'est pas grand chose, j'en conviens, mais c'est déjà un début !

Re: [..] Cliquer sur une cellule de listview

Posté : mer. 03 août 2011 16:58
par ZOTHOP
PandiPanda a écrit :ceci devrai vous convenir;
_GUICtrlListView_ClickItem()

ainsi que ceci; GuiListView management
J'ai essayé le _GUICtrlListView_ClickItem(), quand j'ai lancé le programme, j'ai perdu le contrôle de la souris et du pc ( un vrai virus :mrgreen: ), on dirait une fonction qui déclenche automatiquement des clics de souris !

Re: [..] Cliquer sur une cellule de listview

Posté : mer. 03 août 2011 16:59
par PandiPanda
yop73 a écrit :Bonjour,

Pas moyen de trouver comment cliquer sur une cellule spécifique d'un listview pour en sortir la valeur et la remplacer.

En fait, je veux pouvoir cliquer sur une cellule et la griser.
Ce qui ouvre une petite fenêtre ou inputbox pour modifier la valeur de la cellule et la remplacer pour la sauvegarder.

J'ai cherché sur les forums français et anglais sans succès.
Merci de votre aide si vous pouvez m'aiguiller.
Bonjour,
Pour sortir la valeur d'une listview, il suffit de gerer le click de souris ...

par exemple ici;
► Afficher le texte
Etrange, vous avez utilisé comment le "_GUICtrlListView_ClickItem()" ? ^^

Re: [..] Cliquer sur une cellule de listview

Posté : dim. 07 août 2011 20:09
par ZOTHOP
$item1 = GUICtrlCreateListViewItem("item2", $listview)
$item2 = GUICtrlCreateListViewItem("item3", $listview)
.....
GUICtrlSetData($item1, "ITEM1")
GUICtrlSetData($item2, "ITEM2")

Je travail sur les ListView depuis quelque jours histoire de maîtriser la bête.

Cette méthode est parfaite si on crée un ListView avec un nombre définit d'items à l'avance et travailler sur les valeurs. Mais si on veut plus d'Items il faut en ajouter dans le code et le recompiler ensuite. On ne peut pas demander ça à un débutant en informatique qui a acheté son logiciel dans le commerce.

de mon côté, j'ai essayé de créer 20 items avec une boucle for :
$t=Item
For $a = 1 to 20
$item = GUICtrlCreateListViewItem($t[$a], $listview)
Next

J'ai pu créer 20 items mais la seule donnée que j'ai récupéré et celle du dernier Item. Comme si le ListView ne reconnaissait que celui là.

C'est la même chose quand on utilise des fonctions comme _GUICtrlListView_AddItem

Si jamais on veut créer 20 Items portant les noms de Item1, Item2, Item3.... Item20 avec une boucle for comme cela

For $a = 1 to 20
$item[$a] = GUICtrlCreateListViewItem("item3", $listview)
Next

Afin de pouvoir cibler les Items et récupérer les valeurs en utilisant GUICtrlRead et les changer avec GUICtrlSetData, la boucle va planter le programme.

Ma théorie pour utiliser correctement le ListView

Pour récupérer une valeur simple comme celle d'un Item ou d'un Input ou tout autres contrôles qui ne contiennent qu'une valeur à récupérer, on utilise une variable simple et cette fonction : $a=GUICtrlRead($nomducontrole). On la change avec GUICtrlSetData($nomducontrole,$variable)

Mais pour un ListView qui est un contrôle qui contient des données sous forme de tableau ( plusieurs lignes et plusieurs colonnes), la seule variable qui lui ressemble et qui est capable de contenir des valeurs sous la forme d'un tableau c'est l'Array.

_GUICtrlListView_AddArray m'a mis la puce à l'oreille ce matin. Dans l'exemple on crée d'abord un array à plusieurs lignes et plusieurs colonnes avec des valeurs et _GUICtrlListView_AddArray vient transposer le tableau dans le ListView.

Je pense qu'il ne faut pas travailler directement sur le ListView mais principalement sur un array en y entrant, en y changeant et en y sortant les données au fur et à mesure qu'elles rentrent, qu'elles changent ou qu'elles sortent du ListView. Le ListView n'étant plus alors que le reflet de l'array et son tableau de bord.

Il me faudra d'abord maîtriser les array et toutes les fonctions du ListView avant d' être certain que ma théorie est exacte mais je pense que je suis sur la bonne piste. Libre à vous de travailler sur ce point de votre côté.

Les méninges ont beaucoup fonctionné aujourd'hui :D

Re: [..] Cliquer sur une cellule de listview

Posté : lun. 08 août 2011 00:34
par mikell
ZOTHOP a écrit :Si jamais on veut créer 20 Items portant les noms de Item1, Item2, Item3.... Item20 avec une boucle for comme cela
For $a = 1 to 20
$item[$a] = GUICtrlCreateListViewItem("item3", $listview)
Next
Afin de pouvoir cibler les Items et récupérer les valeurs en utilisant GUICtrlRead et les changer avec GUICtrlSetData, la boucle va planter le programme.
Vous avez essayé ça ? Image

Code : Tout sélectionner

$add = "vraiment"
GUICreate("listview items", 220, 250)
$listview = GUICtrlCreateListView("colonne1|colonne2|colonne3", 10, 10, 200, 220)
For $a = 1 to 20
Assign("item" & $a, GUICtrlCreateListViewItem("item" & $a &"|" & $a*2 & "|" & $a*3, $listview))
Next
GuiSetState()

GUICtrlSetData($item10, "ça marche| très| bien")
$text = StringSplit (GuiCtrlRead($item10), "|")
msgbox(0,"", StringReplace(GuiCtrlRead($item10), "|", ""))
; GUICtrlSetData($item10, "vraiment | | ")
msgbox(0,"", StringReplace($text[1], $text[1], $add))
msgbox(0,"", $text[2])
msgbox(0,"", $text[3] & " !")

Do
    $msg = GUIGetMsg() 
Until $msg = -3

Re: [..] Cliquer sur une cellule de listview

Posté : mar. 09 août 2011 16:17
par GaRydelaMer
Bonjour


je vous recommande plutôt de regarder l'aide de la fonction "_GUICtrlListView_Create", en fait pour utiliser pleinement les ListView, il faut utiliser
GUIRegisterMsg($WM_NOTIFY, "_Events_WM_Notify")

ou _Events_WM_Notify et votre fonction qui va utiliser les messages que Windows envoie sur les événements dans votre fenêtre voir l'aide précédemment cité.

Re: [..] Cliquer sur une cellule de listview

Posté : mar. 09 août 2011 17:00
par timmalos
alors, sachez qu'on ne peut éditer que la première colonne.
Les listview sont en effet très limitées en Autoit.
Voilà un code qui devrait vous aider: Ce que vous voulez faire ressemble à ce que je fais quand l'utilisateur clique sur une donnée de la rubrique "Cryptée".
Une InputBox apparait alors, demande un texte, l'enregistre dans le fichier .ini, et actualise la cellule.

Code : Tout sélectionner

#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#Include <String.au3>

Global $ini_configure = @ScriptDir & "\parametres.ini"



_GuiEDITini()

Func _GuiEDITini()
    Local $w = 800,$h=600,$int = 3
    Global $hListView,$ArrayCrypt[10]
    Dim $array,$iS = 1,$iC = 0
    GUICreate("ListView Edit Label", $w,$h)
    $hListView = GUICtrlCreateListView("", $int, $int, $w-2*$int, $h-2*$int, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetUnicodeFormat($hListView, False);Use ANSI

    GUISetState()

    ; Add columns
    _GUICtrlListView_InsertColumn($hListView, 0, "Valeur",1200)
    _GUICtrlListView_InsertColumn($hListView, 1, "Paramètre",$w/2.7)
    _GUICtrlListView_SetColumnOrder($hListView, "1|0")
    _GUICtrlListView_SetColumnWidth($hListView,0,$LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($hListView,0,_GUICtrlListView_GetColumnWidth($hListView,0)-20)

    _GUICtrlListView_EnableGroupView($hListView)

    ; Add items
    $Sections = IniReadSectionNames($ini_configure)
    If IsArray($Sections) Then
        For $i = 1 to $Sections[0]
            _GUICtrlListView_InsertGroup($hListView, $iS, $iS, $Sections[$i])
            $array = IniReadSection ( $ini_configure, $Sections[$i] )
            If IsArray($array) Then
                For $j = 1 to $array[0][0]
                    _GUICtrlListView_AddItem($hListView, $array[$j][1])
                    _GUICtrlListView_AddSubItem($hListView, $iC, $array[$j][0], 1)
                    _GUICtrlListView_SetItemGroupID($hListView, $iC, $iS)
                    If $Sections[$i] = "Crypt" Then
                        Redim $ArrayCrypt[$array[0][0]]
                        $ArrayCrypt[$j-1] = $iC
                    EndIf
                    $iC+=1
                Next
                $iS += 1
            Else
                MsgBox(0,"","Erreur de lecture  des parametres")
                Return 0
            EndIf
        Next
    Else
        MsgBox(0,"","Erreur de lecture  du fichier de configuration")
        Return 0
    EndIf



    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    Do
        sleep(20)
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    Return 1
EndFunc   ;==>_Main


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $LVN_BEGINLABELEDITA, $LVN_BEGINLABELEDITW ; Start of label editing for an item
                    $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    $id = _ArraySearch($ArrayCrypt,Int(DllStructGetData($tInfo, "Item")))
                    If $id <> -1 Then
                        $rep = InputBox("","Ce champ est crypté. Veuillez donner la nouvelle valeur ci-dessous.",_StringEncrypt(0,_GUICtrlListView_GetItemText($hListView,Int(DllStructGetData($tInfo, "Item"))), "12*/#Max987²", 2))
                        ;_ArrayDelete($ArrayCrypt,$id)
                        If $rep <> "" Then _GUICtrlListView_SetItemText($hListView,Int(DllStructGetData($tInfo, "Item")),_StringEncrypt(1,$rep, "12*/#Max987²", 2))
                        _GUICtrlListView_CancelEditLabel($hListView)
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Item")))
                    EndIf
                    Return False
                Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW ; The end of label editing for an item
                    $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
                    If StringLen(DllStructGetData($tBuffer, "Text")) Then
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Item")),DllStructGetData($tBuffer, "Text"))
                        Return True
                    EndIf
                Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    _GUICtrlListView_EditLabel($hListView,Int(DllStructGetData($tInfo, "Index")))
                    $id = _ArraySearch($ArrayCrypt,Int(DllStructGetData($tInfo, "Index")))
                    If $id <> -1 Then
                        $rep = InputBox("","Ce champ est crypté. Veuillez donner la nouvelle valeur ci-dessous.",_StringEncrypt(0,_GUICtrlListView_GetItemText($hListView,Int(DllStructGetData($tInfo, "Index"))), "12*/#Max987²", 2))
                        If $rep <> "" Then _GUICtrlListView_SetItemText($hListView,Int(DllStructGetData($tInfo, "Index")),_StringEncrypt(1,$rep, "12*/#Max987²", 2))
                        _GUICtrlListView_CancelEditLabel($hListView)
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Index")))
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func _GuiEDITiniSet($ID,$b = "")
    $a = _GUICtrlListView_GetGroupInfo($hListView,_GUICtrlListView_GetItemGroupID($hListView,$ID))
    _GUICtrlListView_SetUnicodeFormat($hListView, TRUE);Use ANSI
    If $b = "" Then $b = _GUICtrlListView_GetItemText($hListView,$ID)
    $c = _GUICtrlListView_GetItemText($hListView,$ID,1)
    _GUICtrlListView_SetUnicodeFormat($hListView, False);Use ANSI"
    IniWrite($ini_configure,$a[0],$c,$b)
EndFunc
 
Pour pouvoir tester, il vous suffit de placer le fichier parametres.ini dans le même répertoire.

Re: [..] Cliquer sur une cellule de listview

Posté : mar. 09 août 2011 18:08
par mikell
timmalos a écrit :alors, sachez qu'on ne peut éditer que la première colonne.
Trouvé ça sur le forum US (me rappelle plus où...)
J'avais cherché 'listview edit subitem' :idea:
► Afficher le texte

Re: [..] Cliquer sur une cellule de listview

Posté : mer. 10 août 2011 22:13
par ZOTHOP
Sinon, je viens de chercher pendant une bonne moitié de l'après midi, pour ceux qui veulent rester sur le code généré par Koda. J'ai mis une flèche sur les points que je trouve important.
Il suffit d'entrer des données dans l'Input cliquer sur ajouter et cliquer plusieurs fois sur un Item pour pouvoir le modifier


► Afficher le texte