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 :

Détecté le wordwrap dans un TMemo


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut Détecté le wordwrap dans un TMemo
    Bonjour tous

    Je suis entrain de faire une appli où l'utilisateur pourra entrer ses propres infobulles.

    Le principe est simple : l'opérateur choisi "entrer un commentaire" grâce à un menupopup sur le composant. De la il écrit son message dans un TMemo.
    Le texte du TMemo est alors enregistré dans un fichier ini.

    Tout les caractères correspondant à "\r\n" sont remplacé par des ";". Le "\r\n" apparaît quand l'utilisateur frappe sur entrée ( ). Ainsi dans le fichier ini, le texte sera complet lors de l'affichage de l'infobulle.

    Lorsque l'utilisateur écrit à la suite sans taper "entrée". le Tmemo fait un retour à la ligne logiciel grâce à wordwrap.Quand j'enregistre dans mon fichier ini, cela correspond à une seule ligne.

    Mon problème est que lorsque je affiche cette ligne dans une infobulle, cela affiche 1seule et grande ligne. Je trouve cela très moche.

    Et j'aimerai donc pouvoir réduire cette ligne en un petit paragraphe.
    Y'a t il un moyen de détecter le wordwrap?
    Si non, avez vous une idée de comment faire?

    J'ai une solution pas très satisfaisante :
    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
     
    {
        TIniFile *pIniFile = new TIniFile(IniPath);
        Text =Memo->Text;
        AnsiString tmp,tmp1;
        tmp= Text;
        int i=1;
        int L = Text->Length();
        /*Défini des retours chariots pour les phrases trop longues*/
        for(int j=0;j<L;j++)
        {
     
                //Regarde à chaque espace si la phrase n'est pas trop longue
                if (Tmp.IsDelimiter(" ",j)==true)
                {
                    if (j>(33*i))  //Si trop de caractère
                    {
                        Tmp.Insert("\r\n",j); //Insere le retour chariot
                        i+=1;
                        j+=1;
                    }
                }
        }
        Text = StringReplace(Tmp, "\r\n", ";", TReplaceFlags() << rfReplaceAll);/*Remplace le sauts de ligne par 1 pointvirgule*/
        pIniFile->WriteString(Unit,Name,Text);
        Text= "";
        delete pIniFile;
    Si l'utilisateur écrit tous en ligne et que de temps en temps il tape "entrée". Le paragraphe n'est pas régulier. Je continue à bosser dessus.

    Mais si quelqu'un à une meilleur solution je suis preneur.
    Merci de votre aide
    ++

  2. #2
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    salut,

    Piste1 : Désactiver le WordWrap de ton Memo, de la sorte l'utilisateur aura une infobulle formatée à sa convenance...

    Piste2 : Ajouter un événement OnChange (double clique sur ton Memo), cet événement doit compter en temps réel le nombre de caractère, au-delà d'un multiple de la largeur de ton mémo ou au-delà d'un multiple d'un nombre A de caractère (if), la fonction récupère la chaîne, y ajoute un retour chariot et rafraîchi le Memo avec la chaîne mise à jour...

    Pour avoir un formatage régulier, essaye la police Courier comme Font...


  3. #3
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Hello

    D'abord merci de ton aide.
    Citation Envoyé par maxim_um
    salut,

    Piste1 : Désactiver le WordWrap de ton Memo, de la sorte l'utilisateur aura une infobulle formatée à sa convenance...
    Hum j'ai essayer mais cette solution ne me plait pas.
    Citation Envoyé par maxim_um
    Piste2 : Ajouter un événement OnChange (double clique sur ton Memo), cet événement doit compter en temps réel le nombre de caractère, au-delà d'un multiple de la largeur de ton mémo ou au-delà d'un multiple d'un nombre A de caractère (if), la fonction récupère la chaîne, y ajoute un retour chariot et rafraîchi le Memo avec la chaîne mise à jour...

    Pour avoir un formatage régulier, essaye la police Courier comme Font...

    J'ai essayer cette solution. Au début je l'ai trouvé séduisante mais le problème est que lorsque l'on va rafraîchir le texte du TMemo, le programme relance l'événement Onchange. Ce qui va amener à remplir continuellement le text du TMemo et ainsi faire un overflow.
    Par contre je vais essayer un timer ca pourrait peut être marcher.

  4. #4
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Bon je suis parti sur une autre piste qui fonctionne comme je le désire.
    J'ai utilisé un TStringList. A chaque ligne faite avec le wordwrap du TMemo, on enregistre la ligne dans la liste et ensuite on met les \r\n pour faire le retour chariot.
    Voici le 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
     
     
        TIniFile *pIniFile = new TIniFile(IniPath);
        TStringList *SL=new TStringList();
        int i;
        Text="";//initialise le text
        //Initialise la StringList
        for(i=0;i<Memo->Lines->Count-1;i+=1)
        {
            SL->Add(Memo->Lines->Strings[i]);
            SL->Strings[i] = SL->Strings[i].Insert("\r\n",SL->Strings[i].Length()+1);
            Text=Text+SL->Strings[i];
        }
        Text = StringReplace(Text, "\r\n", ";", TReplaceFlags() << rfReplaceAll);/*Remplace le sauts de ligne par 1 pointvirgule*/
        pIniFile->WriteString(Unit,Name,Text);
        Text= "";
        delete pIniFile;
        delete SL;

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

Discussions similaires

  1. Positionnement de ligne dans un TMemo
    Par tixu dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/12/2004, 11h45
  2. Position du curseur dans un TMemo
    Par yokito dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2003, 16h35
  3. Taille des tabulations dans un TMemo ?
    Par dergen dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/01/2003, 19h38
  4. Retour chariot dans un TMemo ?
    Par Vincent PETIT dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/08/2002, 18h55

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