TListView et CheckBox

Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
- - Dernière réponse : Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
- 22 sept. 2007 à 22:12
Bonjour à tous.

Le compo TListView permet d'ajouter des cases à cocher dans la liste des éléments affichés (propriété Checkboxes).
Je cherche à capturer l'evenement consistant à cocher ou dé-cocher une case mais je ne trouve pas lequel c'est

Une idée ?
Afficher la suite 

16 réponses

Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
0
Merci
Salut john

if listView1.Items[0].Checked = true then ce que tu veux faire

jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
il faut que tu utilise l'evenement onchange du tlistview, qui te retourne Change=ctState lorsque la checkbox est modifiée.
Attention, ce n'est pas le seul cas ou il te renvoie ctState, ca peut aussi etre la selection de l'item.
Je ne sais pas quelle utilisation tu fais du listview, mais tu peut peut etre utiliser un TCheckListBox
Commenter la réponse de Guillemouze
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
0
Merci
Ben oui, même l'évènement Onclick doit convenir si mes souvenirs sont bons!
En fait le prob. c'est de repérer d'ou vient le clic. Donc, avec la réponse de Guillemouze, ça devrait fonctionner
A+
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
ce n'est pas tout a fait pareil.
Il me semble que sur une checkbox, l'evenement onclick est toujours appelé au changement, alors que su une tlistview, si tu selectionne un element , et que tu appuie sur espace, seul l'evenement OnChange est appelé.
Commenter la réponse de Guillemouze
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
0
Merci
Ah bien bien!
C'est vrai qu'il y a des subtilités au niveau des évènements des contrôles.
Parfois, le Onchange convient mieux pour discriminer les touches, parfois c'est le ONClick en fonction des codes de touches que l'on veut décoder.
Bien à toi.
Commenter la réponse de cs_Jean_Jean
Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
0
Merci
Que de réponses

En fait, je voulais savoir s'il existe pas un évenement qui marche comme un "OnCheck" sur les CheckBoxe classiques.

Je vais creuser un peu plus sur le OnChange ...
Commenter la réponse de John Dogget
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1
0
Merci
Salut,

C'est un peu plus compliqué que ça...
Va voir ici, la réponse s'y trouve :
Implementing the On Item Checked Event for the TListView Control
Il y a une ou deux approximations dans le code, mais ça marche au poil.

Bonne prog'
Commenter la réponse de japee
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
@japee : je suis pas sur de ce que j'avance, mais il me semble qu'en combinant Item.checked et Change=ctState sur le OnChange revient au meme que ce qui est dit dans ton lien !
Commenter la réponse de Guillemouze
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1
0
Merci
@ Guillemouze : oui, tu as raison, c'est beaucoup plus simple !
C'est toi le meilleur.
Merci pour le tuyau .

Bonne prog'
Commenter la réponse de japee
Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
0
Merci
Moi perso, je comprends rien à ton code Japee ...
Commenter la réponse de John Dogget
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1
0
Merci
Je pense que de toute manière il vaut mieux utiliser la manière de Guillemouze, ça donne un truc comme ça :

procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
const
  BoolToStr: array[Boolean] of string = ('False', 'True');
begin
  if Change = ctState then
    with Item do
      Memo1.Lines.Add(Format('[index : %d] %s checked = %s',
                             [Index, Caption, BoolToStr[Item.Checked]]));
end;

A adapter bien sûr, mais on voit bien le fonctionnement.

Bonne prog'
Commenter la réponse de japee
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
0
Merci
Bonjour Japee
Content de te "revoir". Je vois que tu es monté en grade toi-aussi.
J'aime bien ta solution. Il faut que je la mette dans un coin.
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
rendez a cesar ce qui appartient a cesar
Commenter la réponse de Guillemouze
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1
0
Merci
Ave, Jean_Jean.

Petite précision : je n'ai que modestement "habillé" la proposition de Guillemouze.
Voilà cesar, c'est fait.
Commenter la réponse de japee
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
0
Merci
OK, Japee, j'ai bien vu!
Excuse moi Guillemouze si tu pensais que je n'étais pas d'acord avec ta solution.
Depuis le début je suis d'accord, je ne l'ai pas dit assez clairement. C'est que je réfléchissai en même temps aux différents évènements. c'est pas toujours évident.
C'est simplement que l'habillage de jappe m'avait plu et d'ailleurs, c'est dans ces détails que j'apprends le plus car je peux tester le code directement en modifiant certains paramètres pour essayer.
Au fait, est-ce qu'on a répondu à la question de John?
Bien à vous!
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
hey mais c'est pas grave, je disais ca en rigolant ;)
l'important est d'apporter sa contribution pour faire avancer les choses. La reconnaissances des autres n'est pas forcement le plus important.
Je pense qu'avec tout ca, john aura une reponse qui lui convient.

Un petit ajout aux reponses : on peut certainement verifier que c'est bien la checkbox qui a ete changé en faisant quelquechose du genre

TForm1 = class(TForm)
...
private
    LastState: Boolean;
...
end;

Form1.ListView1Changing(...Item...)
begin
    LastState := Item.checked;
end;

Form1.ListView1Changed(...Item...)
begin
    if Item.checked <> LastState then
       showmessage('La check de '+ Item.Caption + ' a ete modifiee');
end;

Ce n'est pas testé, mais je suppose que ca doit marcher.
Commenter la réponse de Guillemouze