[..] Cliquer sur une cellule de listview

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
yop73
Niveau 2
Niveau 2
Messages : 15
Enregistré le : lun. 27 juil. 2009 07:47
Status : Hors ligne

[..] Cliquer sur une cellule de listview

#1

Message 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.
Se dépasser est une course qui ne finit jamais
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#2

Message par PandiPanda »

ceci devrai vous convenir;
_GUICtrlListView_ClickItem()

ainsi que ceci; GuiListView management
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

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

#3

Message 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
Si vis pacem para bellum
Avatar du membre
ZOTHOP
Niveau 3
Niveau 3
Messages : 42
Enregistré le : lun. 14 févr. 2011 14:14
Status : Hors ligne

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

#4

Message 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:
"T'es encore devant ton ordinateur","J'ai essayé derrière mais ça marche nettement moins bien"
yop73
Niveau 2
Niveau 2
Messages : 15
Enregistré le : lun. 27 juil. 2009 07:47
Status : Hors ligne

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

#5

Message 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.
Se dépasser est une course qui ne finit jamais
Avatar du membre
ZOTHOP
Niveau 3
Niveau 3
Messages : 42
Enregistré le : lun. 14 févr. 2011 14:14
Status : Hors ligne

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

#6

Message 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 !
"T'es encore devant ton ordinateur","J'ai essayé derrière mais ça marche nettement moins bien"
Avatar du membre
ZOTHOP
Niveau 3
Niveau 3
Messages : 42
Enregistré le : lun. 14 févr. 2011 14:14
Status : Hors ligne

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

#7

Message 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 !
"T'es encore devant ton ordinateur","J'ai essayé derrière mais ça marche nettement moins bien"
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#8

Message 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()" ? ^^
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
ZOTHOP
Niveau 3
Niveau 3
Messages : 42
Enregistré le : lun. 14 févr. 2011 14:14
Status : Hors ligne

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

#9

Message 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
"T'es encore devant ton ordinateur","J'ai essayé derrière mais ça marche nettement moins bien"
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#10

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

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

#11

Message 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é.
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

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

#12

Message 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.
Fichiers joints
parametres.ini
(2.04 Kio) Téléchargé 186 fois
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#13

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
ZOTHOP
Niveau 3
Niveau 3
Messages : 42
Enregistré le : lun. 14 févr. 2011 14:14
Status : Hors ligne

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

#14

Message 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
"T'es encore devant ton ordinateur","J'ai essayé derrière mais ça marche nettement moins bien"
Répondre