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

MFC Discussion :

Passer a la ligne ds une list box


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut Passer a la ligne ds une list box
    salut à tous!

    En fait j'utilise une listbox ds laquelle je recois un message.
    Suelement, si le message est trop long, la listbox n'est plus assez large.

    Il faut donc passer des lignes pour que le texte ne soit pas manger.

    Voici mo,n code:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
            if (strlen(strTemp)>40)
    		{
    			int truc=strlen(strTemp);
    			int compt=0;
    			CString strTemp3="";
    			do
    			{
     
     
    			strTemp3=strTemp.Mid (compt,compt+40);
    			m_ctrlTexte2.AddString(strTemp3);
     
    			compt=compt+40;
    			truc=truc-40;
    			}while (truc>0);
    			//m_ctrlTexte2.AddString("\t");
    			int k;
    			k=strlen(strTemp)-truc;
    			strTemp3=strTemp.Mid (k,strlen(strTemp));
    			m_ctrlTexte2.AddString(strTemp3);
    		    m_ctrlTexte2.SetTopIndex(m_iNumber);
    		    m_iNumber++;
     
    		}
    		else
    		{
          		m_ctrlTexte2.AddString(strTemp);
    			m_ctrlTexte2.SetScrollPos(SB_VERT,m_iNumber,true);
    			m_ctrlTexte2.SetTopIndex(m_iNumber);
    			m_iNumber++;     
    		}
    Malheuresement, ca lé fait bien au 1er passage dans la boucle, mais ensuite, le mid prends plus de 40 caractères.
    Ce n'est pas normal.
    Y commence au bon endroit mais prends trop de caractères...

    Merci.

    @+.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    je te propose ca comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CString temp="";
    while (strlen(strTemp)>40) {
         temp=strTemp.Mid(0, 40);        // les 40 premiers char.
         m_ctrlTexte2.AddString(temp);   // on les stocke dans le ctrl
         strTemp=strTemp.Mid(40);       // on reduit la chaine de 40
    }
    m_ctrlTexte2.AddString(strTemp);   // on stocke la fin de la chaine

    c'est un peu moins performant sans doute, parce que strTemp est modifiée a chaque tour de boucle, mais c'est plus lisible et je pense que ca devrait fonctionner normalement.

    Fladnag

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    mid extrait une chaine d'une longueur demande à partir d'un ofset.
    le premier argument de mid c'est l'ofset dans la chaine ça c'est bon mais le
    deuxieme c'est la longueur à partir de l'ofset.
    dans ton exemple compte+40 pour la longueur c'est pas bon !
    si tu veux des chaines de 40 mets simplement 40.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
             int compt=0;
             CString strTemp3="";
             do
             {         
                  strTemp3=strTemp.Mid (compt,40);
                 if(!strTemp3.IsEmpty())
                 m_ctrlTexte2.AddString(strTemp3);         
                 compt+=strTemp3.GetLength();
             }while (strTemp3.GetLength()==40);
    essaye ça pour voir .
    ceci dit on peux aussi rajouter un ascenceur horizontal à la liste box avec un peu de code (elle ne le fait pas nativement).
    ou une hauteur de ligne correspondant à plusieurs et en reprenant la main sur l'ecriture de la chaine dans la listbox (j'ai deja donne une reponse dans ce sens sur le forum)
    voir combiner les 2 techniques.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    ok merci!

    Je vais essyer tous ca tt de suite.

    @+.


  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Bon ben ce marche niquel!
    C'etais qd meme une erreur a la con!

    Je vais essayer de voir un autre truc->essayer de laiiser le mot de la fin car les derniers mot des lignes st coupés et sont finis ds l'autre ligne , c dommage.

    @+.


  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    le pb de la cesure devrait pouvoir se regler comme ça simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
              int compt=0;
             CString strTemp3="";
             do
             {         
                  strTemp3=strTemp.Mid (compt,40);
                  while(!strTemp3.IsEmpty() && strTemp3.Right(1)!=" ")              
                       strTemp3=strTemp3.Left(strTemp3.GetLength()-1);
                 if(!strTemp3.IsEmpty())
                         m_ctrlTexte2.AddString(strTemp3); 
                 compt+=strTemp3.GetLength();
             }
             while (compt<strTemp.GetLength());
    a 2 chouias pres soit doit etre bon j'ai pas teste c'est du directe...

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Bon ben je viens de tester le truc de la censure mais ca marche pas.
    ("Le progremme de repond pas").
    Il doit rapasser indefinimment ds la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!strTemp3.IsEmpty() && strTemp3.Right(1)!=" ")
    car qd je met ceci en commentaire, c bon...

    Je vais essyer de comprendre ce que tu as fais pr debugger...

    Merci en tt cas.

    @+.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    je pense qu'en rajoutant ce test ça devrait etre mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(strTemp3.GetLength()==40)
    		  {
    				while(!strTemp3.IsEmpty() && strTemp3.Right(1)!=" ")             
    				   strTemp3=strTemp3.Left(strTemp3.GetLength()-1);
    		  }
    faire le traitement uniquement si la chaine fait 40 de long.
    pour pas tomber dans le cas ou il restera un mot à la fin .

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Alors la merci! c cool ca marche vraiment niquel!

    Bon, je ne comprens pas trop car je ne connais pas ces fonctions mais je vais regarder.

    Merci.

    @+.

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Au fait Farscape, je te remercie bien pour ta technique mais pourrais tu m'expliquer ce que tu fais la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(strTemp3.GetLength()==40) 
            { 
                while(!strTemp3.IsEmpty() && strTemp3.Right(1)!=" ")              
                   strTemp3=strTemp3.Left(strTemp3.GetLength()-1); 
            }
    Car je ne comprends pas tres bien, et je dois l'expliquer.

    Merci beaucoup.

    @+.

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    globalement on part de la droite tant que l'on est sur un mot et on cherche le premier blanc pour s'arreter la on est sure d'avoir une chaine se terminant par un blanc et donc pas de mot coupe

    :le traitement est fait si la longueur de la chaîne extraite contient 40 caractères en dessous ça veut dire que c'est la dernière ligne et ça évite de tourner en rond dead lock (verrou mortel) quand il ne reste plus qu'un mot sans blanc.
    la boucle est maintenue tant que la chaîne n'est pas vide c'est une sécurité pour sortir de la boucle au cas ou il n'y a plus rien.
    et tant que le dernier caractère de la chaîne (right(1) en partant de la droite 1 caractère) est <> " " donc tant que je suis sur un mot .
    strTemp3=strTemp3.Left(strTemp3.GetLength()-1);
    tant que je suis sur un mot on affecte dans la chaîne son contenue -1 caractère :
    left : extraction de la chaîne en partant de la gauche sur une longueur .
    GetLength() longueur de la chaîne en cours sans le '\0'.
    quand on trouve un blanc on s'arrête d'itérer donc je n'ai pas couper un mot.
    la ligne est complète.


  12. #12
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Ok merci!

    Maintenant c clair...

    @+.


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

Discussions similaires

  1. Retour à la ligne dans une liste box
    Par arngrimur dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/10/2011, 16h24
  2. [AC-2007] En-tête de colonne sur plusieurs lignes dans une list box
    Par Rémi GAUDINAT dans le forum IHM
    Réponses: 2
    Dernier message: 25/10/2010, 11h52
  3. Réponses: 0
    Dernier message: 16/12/2007, 20h02
  4. Largeur d'une liste box
    Par poiiop dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/09/2004, 23h47
  5. Réponses: 2
    Dernier message: 17/08/2003, 20h07

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