Page 1 sur 1

[R] Listview élaborée multiselect avec icônes

Posté : jeu. 12 juil. 2012 09:19
par Julien
Bonjour,

Une personne ayant plus d’expérience que moi pourrait il réaliser ceci (ou me dire que ce n'est pas du tout possible).
► Afficher le texte
Le fonctionnement
-----------------

J'aimerais centrer les icônes des colones 1, 2, 4, 5 et 6.

Un clic sur l'icône de la colone 1 change l'icône et met à jour "Check" dans $Array1 ($Array1[$x][1])
Si l'état est à False les autres colonnes ne peuvent pas être modifiées.

Le colonne 3 ("Nom" dans $Array1 ($Array1[$x][3])) doit être éditable et mettre à jour la valeur dans $Array1

Un clic sur l'icône dans les colonnes 4, 5 et 6 doivent inverser l'icône et respectivement mettre à jour les colonne 4, 5 et 6 de $Array1

Le Gui est en Mode Event activé.

J'espère avoir été assez clair dans mon explication. Pour l'accompagner un petit montage visuel pour à quoi cela pourrait ressembler en pièce jointe.

Je sais exactement ce que je veux mais je n'y parviens pas, j'y ai passé beaucoup de temps mais cela ne ressemble à rien.

D'avance merci à celui ou celle qui prendra du temps pour regarder cette demande.

Re: [..] Listview élaboré multiselect avec icône

Posté : jeu. 12 juil. 2012 10:03
par timmalos
Utilisez les balises code , votre message est tellement un pavé indéchiffrable que peu de gens vont faire l'effort de le lire, et je n'en ferai pas parti.

Re: [..] Listview élaboré multiselect avec icône

Posté : jeu. 12 juil. 2012 14:19
par Julien
J'ai édité mon premier message, cela suffit il ?

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 12 juil. 2012 17:50
par mikell
Le problème c'est que $LVS_EX_CHECKBOXES n'autorise qu'une seule checkbox par ligne de listview
Tu peux toujours faire des pseudo-checkboxes, comme ici
http://www.autoitscript.com/forum/topic ... ntry739616
Après, un clic sur un subitem peut à la fois changer d'image, basculer une variable true/false, mettre à jour une array, etc, le clic étant détecté par un GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") => voir le détail dans l'exemple de l'aide pour _GUICtrlListView_Create

Pour rendre un subitem éditable, voilà un modèle qui vient du forum US
► Afficher le texte
En principe ça devrait suffire pour que tu puisses avancer dans ton script Image

Re: [..] Listview élaborée multiselect avec icônes

Posté : mer. 25 juil. 2012 16:29
par Julien
Bonjour,

Merci pour ces sources.

Petite question, est il possible d'aligner (de centrer) une image dans une colonne ?

D'avance merci.

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 12:36
par Julien
J'ai cherché plusieurs heures et il semblerait que changer l'alignement des images dans une listview soit impossible.

Voici mon résultat :
► Afficher le texte
Je n'arrive pas à corriger :

- l'alignement des contrôle Edit lors de la modification (corriger dans le code, merci)
- la latence sur le "click" des icônes (presque obligé de faire du double click)

Dans l'ensemble c'est fonctionnel mais je trouve cela assez moche.

Qu'en pensez-vous et pouvez-vous m'aider à corriger les défauts ?

D'avance merci.

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 14:17
par mikell
Julien a écrit :- l'alignement des contrôle Edit lors de la modification
Ce positionnement se fait à la création des edits, dans la fonction WM_NOTIFY :

Code : Tout sélectionner

$hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] [color=#BF4000]+ 12[/color], $aRect[1][color=#BF4000] + 8[/color], $iLen + 10, 17, $Style)
Pour l'esthétique, si les colonnes doivent rester de largeur constante, pourquoi simplement ne pas afficher les headers ou "tricher" en mettant des labels à la place
Sinon je trouve pas que le temps de latence sur le clic est si long que ça, à partir du moment où la listview a le focus

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 19:08
par Julien
mikell a écrit :Pour l'esthétique, si les colonnes doivent rester de largeur constante, pourquoi simplement ne pas afficher les headers ou "tricher" en mettant des labels à la place
Sinon je trouve pas que le temps de latence sur le clic est si long que ça, à partir du moment où la listview a le focus
Merci Mikell !
Pour la latence il s'agit bien d'une perte de focus.

Pour les labels formidable je n'y avait pas pensé du tout, du coup j'ai ajouté des colonnes pour palier à l'alignement.

Reste maintenant 2 petites choses :

- Cette histoire de focus, comment porter le focus sur la listview et l'enlever lors du passage de la souris dessus ?

J'ai rajouter ceci (dans la fonction WM_NOTIFY) :

Code : Tout sélectionner

Case -121
    ControlFocus("", "", $hWndFrom)
- Pour la première colonne je ne parviens pas à juste afficher l'image lors de la séléction à la souris j'ai un effet de surbrillance, comment l'annuler ?

Voila le code complet mis à jour :
► Afficher le texte

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 19:12
par blacksoul305
Salut,
Julien a écrit :- Cette histoire de focus, comment porter le focus sur la listview et l'enlever lors du passage de la souris dessus ?
Moi j'aurai bien vu un MouseGetPos() non ?

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 19:15
par mikell
Julien a écrit :- Cette histoire de focus, comment porter le focus sur la listview et l'enlever lors du passage de la souris dessus ?
2 solutions
- le GUIRegisterMsg WM_MOUSEHOVER où tu surveilles les coordonnées du pointeur de la souris
- ou nettement plus simple, le GuiGetCursorInfo
avec un GUICtrlSetState($listview, $GUI_FOCUS) ou un ControlFocus() par exemple

Plutôt que de rajouter des colonnes pourquoi ne pas ajuster les largeurs avec _GUICtrlListView_SetColumnWidth ou GUICtrlSendMsg($listview, $LVM_SETCOLUMNWIDTH, $index, $largeur)

En tout cas bien plus jolie ta gui :wink:

Re: [..] Listview élaborée multiselect avec icônes

Posté : jeu. 26 juil. 2012 21:03
par Julien
Correction du code, je n'ai pas trouvé comment intégrer GuiGetCursorInfo, j'ai utilisé la fonction WM_NOTIFY. Cela fonctionne à priori comme je le souhaite.

J'ai rajouté une première colonne pour mon premier problème.

Effectivement je trouve cela plutôt sympa.

Du coup je cherche maintenant trois améliorations qui pourrait être pratique :

- Lors de l'édition du "Nom" la souris disparait, j'ai un peu cherché mais je ne comprend pas pourquoi
- Lors de l'édition du "Nom" l’appuie sur la touche entrée (ou autre mais je préfère pouvoir la choisir) ne valide pas le changement, je vais regarder du coté de WM_COMMAND avec appuis sur une touche (je crois que c'est $NM_KEYDOWN)
- Lors de l'édition du nom le champ input encadré en rouge ne s'adapte pas au texte tapé (dans la limite de la largeur de la colonne)

Mais la je crois pas être capable de réaliser ces modifications.

Voila ce qui fonctionne :
► Afficher le texte
Merci encore pour votre aide.

Re: [..] Listview élaborée multiselect avec icônes

Posté : ven. 27 juil. 2012 13:56
par mikell

Code : Tout sélectionner

$a = GUIGetCursorInfo()
If $a[4] = $listview then...   " $array[4] = ID of the control that the mouse cursor is hovering over "
Julien a écrit :- Lors de l'édition du nom le champ input encadré en rouge ne s'adapte pas au texte tapé (dans la limite de la largeur de la colonne)
Faire un changement de taille dynamique de l'edit risque d'être compliqué et surtout terrible pour l'exécution du script, pourquoi ne pas juste donner directement à l'edit la largeur de la colonne ? (voir code ci-dessous)

Pour la touche, en théorie tu peux placer un $LVN_KEYDOWN dans le NOTIFY, en pratique tu vas interférer avec la saisie dans l'edit ^^
Avec la touche Enter la moins mauvaise solution semble être celle-là :
(j'utilise un HotkeySet mais un GuiSetAccelerators serait sans doute plus approprié)
► Afficher le texte
Le pointeur de souris franchement on s'en fout puisque de toute façon à la validation de la saisie (par clic ou touche) il réapparaît 8)

Re: [..] Listview élaborée multiselect avec icônes

Posté : ven. 27 juil. 2012 15:05
par Julien
Merci beaucoup pour votre aide précieuse !

Le sujet est maintenant résolu.


Pour le GUIGetCursorInfo() en fait j'avais bien lu la doc mais je ne savais pas ou le placer (à priori en le déclarant en haut du code et en le surveillant dans le while ?)

Sinon je vais jeter un œil pour le HotkeySet.

Encore merci.

Re: [..] Listview élaborée multiselect avec icônes

Posté : ven. 27 juil. 2012 15:10
par sylvanie
Bonjour,
dans ce cas, pensez à passer votre post en résolu [R] en éditant le sujet du premier post
merci