TListView et CheckBox

Signaler
Messages postés
384
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
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 ?

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
Salut john

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

jean_Jean
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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é.
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
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.
Messages postés
384
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009

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 ...
Messages postés
1717
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
23 juin 2020
3
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'
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
@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 !
Messages postés
1717
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
23 juin 2020
3
@ Guillemouze : oui, tu as raison, c'est beaucoup plus simple !
C'est toi le meilleur.
Merci pour le tuyau .

Bonne prog'
Messages postés
384
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009

Moi perso, je comprends rien à ton code Japee ...
Messages postés
1717
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
23 juin 2020
3
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'
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
rendez a cesar ce qui appartient a cesar
Messages postés
1717
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
23 juin 2020
3
Ave, Jean_Jean.

Petite précision : je n'ai que modestement "habillé" la proposition de Guillemouze.
Voilà cesar, c'est fait.
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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.