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 :

TMemo C++ Builder 6


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut TMemo C++ Builder 6
    Salut à tous.

    Je programme actuellement un petit terminal série mais j'ai un problème qui se pose.
    J'affiche les caractères reçus dans un Memo avec un assenceur, mais voilà, je ne vois pas comment faire pour ajouter des caractères dans ce Memo sans passer par Memo->Texte+="nouveau text".
    Car dans ce cas précis, c'est très lent, et en plus l'affichage pointe vers le début du Memo et donc je dois sans cesse le forcer à afficher la fin du Memo... Ce qui est du plus mauvais effet...

    Il y a bien une méthode pour ajouter des lignes mais ça ne me convient pas...
    Quelqu'un a-t-il une solution à ce problème?[/COLOR]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WindowRx->Text += RxBuff;                                        // ajouter du texte au mémo
    WindowRx->SelStart = (WindowRx->Text.Length());   // mettre le pointeur à la fin du mémo
    WindowRx->Perform(EM_SCROLLCARET,0,0);       // mettre le pointeur à la fin du mémo
    Johanboy

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Bonjour, si tu souhaites aller plus vite, il est aussi nécessaire de purger les lignes "enciennes", celle qui sont en haut du mémo.

    Ceci dit, je n'ai pas constaté de lenteur particulière liée à cela.

    Si c'est le cas tu peux toujours temponner tes datas dans un tableau ou un AnsiString et les envoyer ensuite complètement par bloc à ton mémo avec un cycle donné par un timer.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    Bonjour,

    merci pour ta réponse.

    tu peux toujours temponner tes datas dans un tableau ou un AnsiString et les envoyer ensuite complètement par bloc à ton mémo avec un cycle donné par un timer.
    WindowRx->Text += RxBuff; // ajouter du texte au mémo
    WindowRx->SelStart = (WindowRx->Text.Length()); // mettre le pointeur à la fin du mémo
    WindowRx->Perform(EM_SCROLLCARET,0,0); // mettre le pointeur à la fin du mémo
    cette partie de code est effectivement dans un timer.

    J'ai également concaténer RxBuff pour ensuite l'ajouter.

    WindowRx->Text = RxBuff;
    Mais le résultat et identique.

    Ce qui me gène, c'est que lors de l'affectation au mémo par une ou l'autre manière, le curseur pointe au début du mémo, je dois donc lui dire à chaque fois de repointer à la fin, et il a un effet de va-et-vient désagréable et qui s'amplifie avec la longueur du mémo.

    si tu souhaites aller plus vite, il est aussi nécessaire de purger les lignes "enciennes", celle qui sont en haut du mémo.
    J'efface bien sûr les lignes précedentes après une certaine longueur et j'en efface 20% histoire de ne pas devoir effacer des ligne à chaque cycle du timer.

    Donc ce que je voudrais, c'est juste ajouter mon AnsiString à la suite sans tout réécrire le Memo et que le curseur pointe toujours à la fin...

  4. #4
    Membre émérite
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Par défaut
    Salut !

    Pour ajouter une ligne dans ton memo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    WindowRx->Lines->Add(RxBuff);
    et pour scroller vers la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    void __fastcall TForm1::WindowRxChange(TObject *Sender)
    {
    SendMessage(WindowRx->Handle, WM_VSCROLL, SB_BOTTOM, 0);        
    }
    Espérant t'avoir aider.


    Bonne continuation !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    Salut !

    Pour ajouter une ligne dans ton memo :



    WindowRx->Lines->Add(RxBuff);
    Ben le problème, c'est que je veux pas ajouter une ligne, mais bien ajouter du text à la suite...

    Je commence à me demander si je n'aurais pas facile à prendre un API windows pour remplacer le memo(composant builder).

    Quel API me permettrait de remplacer le memo?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je ne comprends pas trop ce que tu cherches à obtenir.

    Si par exemple on suppose n'afficher que les 16 derniers codes entrés en n'utilisant que la première ligne du TMemo :

    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
    int n = 0; //compteur d'entrées
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    //pour simuler mes entrées
    AnsiString N = IntToStr(n % 256) + ",";
    if(n < 16)
        {
        Chaine = Chaine + N;
        }
    else
        {
        int pos = Chaine.Pos(",");
        Chaine = Chaine.SubString(pos+1, Chaine.Length()) + N;
        }
    n++;
    Memo1->Lines->Strings[0] = Chaine;
    }
    Autre exemple qui affiche 16 entrées par lignes en ajoutant une ligne lorsque c'est nécessaire (c'est sans doute dans ce sens la ... ???)

    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
    //Compteur de lignes
    int y=0;
    //Compteur d'entrées
    int n=0;
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    //Pour simuler une entrée
    AnsiString N = IntToStr(100) + ",";
    if(n > 15)
        {
        n=1;
        Memo1->Lines->Add(N);
        y++;
        }
    else
        {
        n++;
        Memo1->Lines->Strings[y] = Memo1->Lines->Strings[y] + N;
        }
    }
    Comme tu peux le voir, j'ai simulé cette capture à l'aide d'un TSpeedButton...

    Sinon... ???

    A plus !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    Merci pour ta participation henderson.

    Effectivement cette manière de procéder semble être intéressante.

    Mais je ne peux pas travailler caractère par caractère, ça va être bcp trop lent surtout que j'utilise mon terminal à 115k bauds...

    Et donc, je vais devoir gérer également les passages à la ligne éventuels qui se trouveraient dans la trame texte... (je filtre déja la trame reçu par le port série pour que tout '\r' ou '\n' donne ceci "\r\n" car sinon le memo affiche un caractère spécial (un carré).

    Je vais travailler celà et je reviens quand j'ai avancé.

    Merci à vous.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonMemo->Text += (AnsiString) "hi !";
    Et ça supporte très bien les \n.

Discussions similaires

  1. c++ builder TMemo
    Par ola-oz dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/02/2010, 13h02
  2. TMemo C++Builder version2007
    Par 3logy dans le forum C++Builder
    Réponses: 8
    Dernier message: 29/08/2007, 16h00
  3. le composant TMemo de builder avec une Form
    Par boopix dans le forum C++Builder
    Réponses: 7
    Dernier message: 15/09/2006, 16h00
  4. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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