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 :

Afficher un Hint dans une ListView


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut Afficher un Hint dans une ListView
    Bonjour,

    Dans une ListView comportant plusieurs colonnes et lignes,
    il arrive parfois que le texte soit plus large que la colonne.
    Un simple passage de la souris sur le texte fait apparaître le texte en entier dans un Hint.
    Comment fait-on pour réaliser cet effet ?

  2. #2
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonsoir,
    Je viens d'essayer un petit quelquechose qui s'approche peut etre de ce que tu recherches : avec l'évènement OnInfoTip du TListView.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TfrmTexture::ListeSousElementInfoTip(TObject *Sender,
          TListItem *Item, AnsiString &InfoTip)
    {
    InfoTip = Item->SubItems[0].Strings[0];
    }
    par exemple ceci affiche le texte du premier sous élément (première colonne) lorsque l'on survole les lignes du listview.
    Mais je ne sais comment repérer sur quelle colonne on se trouve, du moins pas encore...
    Et puis, c'est peut etre qqchose déja essayé qui ne te suffisait pas, dans ce cas mille excuses...
    Bon courage, @ +

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Merci Cantrelle. Ce n'est pas tout à fait ce que je cherche, mais c'est un début.
    Ici, le problème, le Hint est mal positionné.

    J'ai trouvé pour la première colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TfrmTexture::ListeSousElementInfoTip(TObject *Sender,
          TListItem *Item, AnsiString &InfoTip)
    { 
    InfoTip = Item->Caption;
    }
    J'ai bien trouver un exemple de ce que je cherche dans les exemples de Borland dans le répertoire suivant : \Borland\Examples\VirtualListView
    Mais je n'arrive pas à mettre la main sur le code qui gère cet effet.

  4. #4
    Membre éprouvé
    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 : 54
    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
    Par défaut
    (re)Bonsoir,
    Ben, mon problème maintenant c'est que l'exemple que tu cites, chez moi, et ben il fait rien en rapport avec le sujet : pas de hint, pas de infotip ...
    mais c'est peut etre moi qui déconne.
    Pour régler le soucis de la colonne 'survolée', j'ai bricolé un petit quelquechose en guise de test. Ca aura au moins peut etre le merite de faire réagir quelqu'un de plus doué que moi...
    Dans le OnMouseMove :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //test pour un listview de 3 colonnes...
    int WColonne1 = FormX->ListViewX->Column[0]->Width;
    int WColonne2 = FormX->ListViewX->Column[1]->Width;
    int WColonne3 = FormX->ListViewX->Column[2]->Width;
    if (X > 0 && X < WColonne1)
    {
            FormX->IndiceColonne = 0;
    }
    if (X > WColonne1 && X < (WColonne1 + WColonne2))
    {
            FormX->IndiceColonne = 1;
    }
    if (X > (WColonne1 + WColonne2) && X < (WColonne1 + WColonne2 + WColonne3))
    {
            FormX->IndiceColonne = 2;
    }
    Dans le OnInfoTips :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    switch (FormX->IndiceColonne)
    {
    case (0):
    InfoTip = Item->Caption;
    break;
    case (1):
    case (2):
    InfoTip = Item->SubItems[FormX->IndiceColonne - 1].Strings[0];
    break;
    }
    Inconvénients:
    .c'est surement loin d'etre génial
    .ca réponds pas encore a l'attente, la position du hint n'etant pas celle recherchée (si j'ai bien compris , il faudrait qu'il soit completement en couverture de la ligne , non ?)
    @+




  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Sympa de chercher une solution à mon problème.
    Pour l'exemple avec Borland, voici ce que j'obtiens pour les textes trop courts :


    Cela fait un bon moment que je cherche dans le code de cet exemple, et je ne vois toujours pas ou cela est géré.
    Mais je vais encore cherché, je finirais bien par trouver.

    Pour le positionnement du Hint, il me semble que cela se fait avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->ActivateHint(TPoint CursorPos);

  6. #6
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Salut,
    Je ne sais pas si tu cherches encore pour ton problème, moi j'ai continué avec ce soucis de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->ActivateHint(TPoint CursorPos);
    car il ne me donne pas le resultat escompté...
    J'ai essayé aussi des choses comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->ActivateHint(Mouse->CursorPos);
    ou ds OnInfoTip, d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Item->GetPosition();
    et d'obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application->ActivateHint(Item->GetPosition())
    par exemple.
    Mais pour moi rien de neuf, l'hint s'affiche a une position 'classique'
    Je sais plus trop quoi essayer
    Je crois que je vais etre content lorsque la solution pointera le bout de son nez...

  7. #7
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Bonjour,

    J'ai fait une petite découverte :
    Dans mon programme, je mets à jour la ListView en appelant simplement la fonction : void __fastcall TForm1::AfficherListView(void)
    Dans cette fonction se trouve une boucle qui copie un tableau dans la ListView.

    Dans l'exemple de Borland, c'est tout à fait différent.
    La mise à jour de la ListView se fait par la méthode ListView->Repaint();
    C'est l'évènement OnData de la ListView qui met à jour la ListView un à un, et non par une boucle.
    Et cet évènement est appelé lors d'un survol de la souris sur la ListView
    Je suis prêt à parier que c'est à ce moment que ce Hint est créer.

    Je vais faire les modifications dans mon programme, et je vous tiens au courant.

  8. #8
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonjour,
    J'ai cherché du coté de l'évènement OnShowHint de TApplication. Avec celui ci on peut travailler sur et sur ces propriétés par exemple.
    De meme, dans l'évènement OnInfoTip du ListView on a acces a par exemple.
    Avec tout ceci je pensai pouvoir m'en tirer mais je n'ai pas un résultat parfait
    J'ai l'impression d'etre a la fois pas tres loin, et un peu a coté de la plaque quand meme ...
    A plus tard. Bon courage...

  9. #9
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonjour,
    Je pense avoir quelquechose de cohérent grace aux OnInfoTip et OnShowHint cités tout a l'heure.
    Dans OnInfoTip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TPoint pPoint = FormX->ListViewX->ClientToScreen(Item->GetPosition());
    FormX->PosItem = pPoint.y; // Ou PosItem est une variable 'Private' de FormX de type int
    Dans OnShowHint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall FormX::GestionHint(System::AnsiString &HintStr, bool &CanShow, THintInfo&HintInfo)
    {
      if (FormX->ListeSurvol == true)
      {
         HintInfo.HintPos.y =FormX->PosItem;
      }
    } 
    //J'utilise pour l'instant bool ListeSurvol pour m'assurer que le comportement du hint n'est modifié que pour l'objet listview qui nous interesse, faut voir l'interet du truc...
    Dans le Oncreate de FormX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->OnShowHint = GestionHint;
    J'obtiens ainsi chez moi une bulle info alignée pile sur le 'top' de l'item du listview survolée.
    On doit pas etre loin de l'effet recherché, non ?
    @ +

  10. #10
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Bonjour,

    Très bien. Moi de mon côté, je ne sais toujours pas comment l'exemple de Borland fonctionne.
    Alors je me suis retourné sur ta méthode que j'ai légèrement modifié.

    Dans OnInfoTip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TFormX::ListViewInfoTip(TObject *Sender, TListItem *Item, AnsiString &InfoTip)
    {  TPoint pPoint  = FormX->ListView->ClientToScreen(Item->GetPosition());
       Form1->PosItem = pPoint;                   //PosItem est une variable 'Private' de FormX de type TPoint
    }
    Dans OnShowHint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::GestionHint(System::AnsiString &HintStr, bool &CanShow, THintInfo&HintInfo)
    {  if(HintInfo.HintControl == ListView)
       {  HintInfo.HintPos     = Form1->PosItem;   //Positionne le Hint
          HintInfo.HideTimeout = 10000;            //Supprime le scintillement
       }
    }
    Dans le OnCreate de FormX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->OnShowHint = GestionHint;
    Pour ma part, c'est presque parfait.
    Il suffit de l'afficher seulement si le texte est tronqué.

  11. #11
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonsoir,
    Pour le dernier soucis, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool InfoLong; //Private
    dans OnInfoTip, j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TRect pRect = Item->DisplayRect(drBounds);
    if (Item->Caption.Length() > pRect.Width())
    {
    frmTexture->InfoLong = true;
    }
    else
    {
    frmTexture->InfoLong = false;
    }
    et dans 'GestionHint' (pour OnShowHint):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            switch (frmTexture->InfoLong)
            {
            case true:
                    CanShow = true;
            break;
            case false:
                    CanShow = false;
            break;
     
            }
    On doit etre sur la bonne voie la
    Mais y a peut etre mieux, mais pour l'instant moi j'ai pas mieux (au regard de mes connaissances) en espérant que cela réponde a ton souci.
    En tout cas, je me servirai de cela pour mon projet (j'ai ainsi un peu travaillé pour moi la )
    A plus tard....

  12. #12
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Bonjour,

    J'ai modifié histoire d'affiner un peu plus :

    Dans 'Private' de FormX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       TPoint PosItem;
       bool InfoLong;
    Dans OnInfoTip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TFormX::ListViewInfoTip(TObject *Sender, TListItem *Item, AnsiString &InfoTip)
    {  TPoint pPoint  = FormX->ListView->ClientToScreen(Item->GetPosition());
       FormX->PosItem = pPoint;
       FormX->InfoLong= Item->Caption.Length()*6>Item->DisplayRect(drLabel).Width();
    }
    Dans OnShowHint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TFormX::GestionHint(System::AnsiString &HintStr, bool &CanShow, THintInfo&HintInfo)
    {  if(HintInfo.HintControl == ListView)
       {  HintInfo.HintPos     = FormX->PosItem;   //Positionne le Hint
          HintInfo.HideTimeout = 10000;            //Supprime le scintillement
          CanShow              = FormX->InfoLong;  //Controle de l'affichage
       }
    }
    Dans le OnCreate de FormX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->OnShowHint = GestionHint;
    Pour moi, tout est bon. Je n'ai pas besoin de plus.
    Cantrelle, je te remercie de ton aide.

  13. #13
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Par défaut
    Bonjour,

    La bonne blague !!!
    Je reviens sur mon exemple de Borland. Et j'ai trouver pourquoi cela ne fonctionnait pas sur mon programme.
    Lorsque mon appliquation est affichée, j'affiche cette fenêtre au premier plan.
    Le Hint s'affichait bien, mais derrière la fenêtre.
    Je m'en suis apperçu par accident, lorsque mon curseur a survolé un texte très long.
    Un bout du Hint dépassait à droite de la fenêtre.
    Et là, je suis vert.

  14. #14
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonjour,
    De toutes facons, de mon coté un traitement spécifique du hint sur un listview etait le bien venu.
    Et puis, j'aurais peut etre pas fait la démarche si tot sans cela....
    A plus tard peut etre pour ton autre sujet sur la Dll et les icones; bien que je crois cela hors de ma portée, malgré son interet.
    @ +

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

Discussions similaires

  1. Afficher des images dans une listView de manière asynchrone
    Par badaboo dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 23/02/2010, 09h47
  2. afficher les données d'une requête dans une ListView
    Par modafine dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/12/2008, 04h44
  3. afficher une arraylist dans une listview
    Par ninolf dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/05/2008, 12h02
  4. Afficher des informations dans une ListView
    Par revero275 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/04/2007, 21h58

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