IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Comment trouver le SubItem cliqué dans un TListview ? [FAQ]


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Comment trouver le SubItem cliqué dans un TListview ?
    Bonjour,


    Je viens de la FAQ où j'ai bien lu "Comment utiliser le composant TListView ?" mais je n'ai pas trouvé de réponse.

    Un rapide tour dans google ne m'a pas donné de réponse non plus.

    Voila le problème. J'utilise BCB 6 pro. J'ai un composant TlistView qui contient des éléments sur plusieurs colonnes.
    Le TListView est toujours en mode "vsReport" (tableau)

    Je voudrais récupérer le sous-élément sur lequel je clique.
    J'arrive facilement à récupérer un pointeur sur le TListItem (premier élément de la ligne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TListItem *pItem = pListe->Selected;
    // ou bien :
    TListItem *pItem = pListe->ItemFocused;
    Mais je n'arrive pas à récupérer le "subItem" cliqué (nième élément de la ligne cliqué)

    Vous auriez une idée pour récupérer le sous-élément cliqué ?

    C'est peut être pas possible ?

    Il y a toujours la solution de capturer la position de la souris lors de l'évènement "onMouveMove" et de calculer la colonne cliquée en fonction de la largeur de chaque colonne, mais j'espère qu'il y a plus simple !

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,
    Essaies
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm5::ListView1Click(TObject *Sender)
    {
    ShowMessage(ListView1->ItemFocused->SubItems[0].Strings[0]);        
    }
    @ +

  3. #3
    Invité
    Invité(e)
    Par défaut
    TListItem * pItem = ListView1->ItemFocused me renvoie l'élément qui a le focus, OK

    Pourquoi pItem->SubItem[0] serait l'élément sur lequel j'ai cliqué ?

    Et si j'ai cliqué sur le SubItem[2] ?

    J'ai bien peur que ton code ne fonctionne pas dans un cas général.
    Tu as dû tester ça avec un cas à 2 colonnes seulement.

    Merci quand même d'avoir essayé.

  4. #4
    Invité
    Invité(e)
    Par défaut OK
    C-y-est, j'ai trouvé une solution qui me satisfait

    J'utilise l'évènement OnMouseUp du listView qui me donne la position de la souris sur le TListView.

    Je parcours les colonnes du listView
    - je calcule pour chaque colonne la position gauche et droite de la colonne.
    - si mon X souris est entre ces deux positions, j'ai trouvé mon numéro de colonne.

    Si vous trouvez une solution plus simple, n'hésitez pas !
    Merci.

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Salut,
    Dsl pour la première réponse, j'avais été un peu 'léger' a la lecture du problème...
    J'ai toujours pensé que la solution devait se cacher ds OnAdvancedCustomDrawSubItem (ou un de ces petits frères), mais avec un nom pareil (un cauchemar annoncé) cet évènement est plus dur a apprivoiser que prévu; en tout cas je n'arrive pas a en tirer l'effet escompté.
    Un jour peut être...
    @ +

  6. #6
    Invité
    Invité(e)
    Par défaut Fausse piste...
    L'évènement "OnAdvancedCustomDrawSubItem" se produit si on a choisi de dessiner soit même les éléments du TlistView.

    Pour ma part j'ai choisi "OwnerDraw = false". L'évènement "OnAdvancedCustomDrawSubItem" ne se produira donc jamais.

    D'autre part la solution se trouve du coté d'un évènement souris (clic dans la liste), ou style "OnEditing". Il y a vraiment très peu de chances que l'on trouve ce qu'il faut sur un évènement de dessin "On...Draw...".

    Merci quand même Cantrelle...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    Ceci peut être la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fascall TForm1::ListView1MouseDown(TOject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      LVHITTESTINFO lvhtti;
      lvhtti.pt = Point(X, Y);
      if(SNDMSG(ListView1->Handle, LVM_SUBITEMHITTEST, 0, reinterpret_cast<LPARAM>(&lvtti) != -1)
      {
         const int ligne = lvtti.iItem;
         const int colonne = lvtti.iSubItem;
         ....
         .....
      }
    }
    (trouvé sur Internet

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Salut Pasqualini,

    C'est beau ca....
    J'avoue que j'avais regardé du coté de LVM_SUBITEMHITTEST et cie mais je ne savais pas vraimment comment les utiliser de la bonne manière.

    @ +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2012, 14h43
  2. Comment trouver un serveur COM dans la ROT?
    Par Zalathorn dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2008, 15h28
  3. Comment trouver des structures incluses dans d'autres
    Par Vulcanos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/10/2006, 23h59
  4. [TWebBrowser] Comment trouver tous les liens dans une page ?
    Par xenos dans le forum Composants VCL
    Réponses: 1
    Dernier message: 15/01/2006, 23h36
  5. Réponses: 2
    Dernier message: 19/10/2005, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo