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

Composants VCL Delphi Discussion :

TRichEdit et lenteur d'affichage


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 48
    Points : 31
    Points
    31
    Par défaut TRichEdit et lenteur d'affichage
    Bonjour et bonne année.

    J'ai une programme qui analyse des fichiers binaires et renvoie au fur et à mesure le resulat (compréhensible en mode texte) au travers d'un TRichEdit.
    J'utilise un TRichEdit pour le formatage (Gras, couleur etc..).
    Mon code pour ajouter les lignes est basic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monRichEdit.lines.add('Ma ligne');
    J'ai fais un petit test de rapidité
    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
     
    procedure Tfmain.Button4Click(Sender: TObject);
    var i : integer;
     debut : tdatetime;
         AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond : word;
    begin
        monRichEdit.Clear;
         debut := now;
        for i:=1 to 3000 do
        begin
            monRichEdit.SelAttributes.Style := [fsbold];
            monRichEdit.Lines.Add(inttostr(i)+'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -');
            monRichEdit.Lines.Add('Essai d ajout d une ligne dans le memo  ');
        end;
     
        decodedatetime((now-debut),AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond);
        Label_duree_parsing.Caption :='Durée traitement : '+ format('%2d',[(AHour)])+'h'+inttostr(AMinute)+'mn'+inttostr(ASecond)+'s'+
       inttostr(AMilliSecond)+'ms';
    end;
    Les résultats sont étonnants :
    pour 1500 boucles : 2s200ms environ
    pour 3000 boucles : 6s100 environ

    Tout celà est très long et deux questions :
    - Comment améliorer la performance (car finalement mon prog met plus de temps à afficher le resultats qu'a faire l'analyse)
    - pourquoi c'est pas linaire (3000 boucles devrait être 2 fois plus lent que 1500) ?
    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Tu trouveras la réponse pour la lenteur, ainsi que le code d'une astuce pour le speed ici : http://www.developpez.net/forums/sho...d.php?t=467303

    pourquoi c'est pas linaire
    ... parceque avec Add Delphi est obligé à chaque tour de boucle d'ajouter la nouvelle chaîne à la fin de la liste dont la longueur augmente elle-aussi à chaque tour de boucle.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Merci pour la reponse rapide.
    Affectivement, en terme de performance, c'est bien plus rapide de "tracer" d'abord dans la Stringlist.
    Mais j'ai quand même un gros pb, le formatage que j'avais (gras, souligné, couleur) est perdu.
    Si vous avez d'autres astuces/méthodes ?
    Merci.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Affectivement, en terme de performance, c'est bien plus rapide de "tracer" d'abord dans la Stringlist.
    ... Dans la discussion vers laquelle je t'ai renvoyé, il se trouve que le demandeur est obligé de passer par une StringList.

    Mais j'ai quand même un gros pb, le formatage que j'avais (gras, souligné, couleur) est perdu. Si vous avez d'autres astuces/méthodes ?
    ... il y a d'autres astuces mais pour en dire plus faudrait en savoir plus à propos de ton besoin car à voir le code de ta procedure Tfmain.Button4Click(); tu fais 3000 fois monRichEdit.SelAttributes.Style := [fsbold] ce qui signifie que tu veux mettre la totalité du RichEdit en gras ... ce qui peut se faire d'un seul coup après avoir chargé la totalité du texte dans le RichEdit avec pour cette mise en gras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonRichEdit.SelectAll;
    monRichEdit.SelAttributes.Style := [fsbold];
    ... Donc pour avancer faudrait qu'on en sache davantage sur ton besoin de formatage pour voir s'il ne serait pas possible de charger rapidement ton texte brut dans le RichEdit et d'effectuer le formattage après chargement car si ton besoin de formattage se résolvait auparavent avec des Add, vu ton code, cela signifie que le formattage s'appliquait à toutes ou seulement certaines lignes ayant telle ou telles caractérisqtique(s) (lesquelles ?).

    Autre exemple si ton texte formatté est toujours le même tu peux le créer par exemple avec Word même avec des indices et des exposants, le sauver au format *.rtf et le charger d'un seul coup avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monRichEdit.lines.LoadFromStream(monFileStream);
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Le code donné en exemple était pour illustrer le pb que je rencontrais.
    Mon formatage de texte depends bien sur de l'anaylse des données que je reçois.
    J'ai un client qui recoit des données (binaires) d'un serveur au fils de l'eau via une socket en mode connecté (TCP/IP).
    Ces données sont parcées par le client et affiche dans un TRichEdit les plus 'importante' en mode text.
    Pour facilité l'analyse des données reçus par un utilisateurs, j'ai une mise en page avec des lignes en carateres gras, d'autres en souligné, d'autres en couleurs etc..
    D'ou mon besoin de formatage de texte pour facilité la lecture et dégager les elements essentiels.
    Merci.

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Bonjour,

    J'ai un client ... Pour facilité l'analyse des données reçus par un utilisateurs, j'ai une mise en page avec des lignes en carateres gras, d'autres en souligné, d'autres en couleurs etc..
    D'ou mon besoin de formatage de texte pour facilité la lecture et dégager les elements essentiels.
    ... donc je suppose que ce n'est pas ton client qui t'envoie du texte formatté mais qu'il t'a donné les caractéristiques ou critères à respecter pour mettre telle ligne en gras et telle autre en souligné etc, et dans ce cas sont ces critères qu'il faut examiner pour voir comment on peut les appliquer au texte après avoir chargé rapidement le texte brut dans le RichEdit : c'est quoi ces caractéristiques ou critères ? La présence de tel ou tel mot dans la ligne (mot pouvant être une référence d'article, une chaîne numérique, un code, etc) ?

    A+

    EDIT du 07/01/2008 - 12h40: En bref l'idée de base pour accélérer le chargement du texte et son affichage dans le RichEdit est de ne pas réaliser son formattage lors de ce chargement ce qui nécessite d'effectuer ce formattage avant où immédiatement après ce chargement. Et la deuxième idée qui accélère bigrement le chargement est de transférer le texte au préalable dans un Stream vu que le chargement d'un RichEdit avec LoadFromStream est ce qui est le plus rapide.
    Et pour transférer le texte-donné dans un Stream faudrait savoir si ce texte arrive sous la forme d'un fichier, d'une StringList, d'un array of string, ou plus simplement sous forme d'une chaine-longue subdivisée par une série de #13#10 car le code de transfert sera légèrement différent selon le cas.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Re,
    Merci pour les reponses et désolé pour la longue période de silence.
    Effectivement, certains mots, ou suites de mots se retrouve lors d'un formatage particulier.
    La question est, comment formater mon texte dans le richEdit :
    - Après le "vidage" du Mermorysteam dans le richedit comment ? est-ce rapide ?
    - Avant le vidage ? est-ce possible ?
    Merci.

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    1) A propos de :
    Effectivement, certains mots, ou suites de mots se retrouve lors d'un formatage particulier.
    La question est, comment formater mon texte dans le richEdit :
    - Après le "vidage" du Mermorysteam dans le richedit comment ?
    Par exemple avec :
    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
     
    procedure illuMots( Mot : string; coul : tColor; Styl: TFontStyles; var red : tRichEdit);
    //@param Mot  = mot ou bout de phrase à formatter dans le RichEdit 'red'
    //@param coul = couleur à passer à 'mot'
    //@param styl = gras, italic, ou souligné à passer à 'mot'
    //@param red  = RichEdit-cible
    var       FoundAt: LongInt;
              StartPos, ToEnd: Integer;
    begin     with red do
              begin // commence la recherche après la sélection en cours s'il y en a une
                    //  sinon, commence au début du texte
                    if SelLength <> 0 then StartPos := SelStart + SelLength
                                      else StartPos := 0;
                    // ToEnd indique la longueur entre StartPos et la fin du texte du contrôle
                    ToEnd:=Length(Text) - StartPos;
                    FoundAt:=FindText(mot, StartPos, ToEnd, [stMatchCase]);
                    while FoundAt <> -1 do
                    begin SetFocus;
                          SelStart := FoundAt;
                          SelLength := Length(mot);
                          SelAttributes.color:=coul;
                          SelAttributes.Style:=Styl;
                          SelLength:=0;
                          StartPos:=SelStart+Length(mot);
                          FoundAt:=FindText(mot, StartPos, ToEnd, [stMatchCase]);
                    end;
              end;
    end; // illuMots
    ... avec par exemple la ligne illuMots( 'Tagada', clRed, [fsBold], RichEdit1);
    ce code passe en rouge-gras tous les mots ou sous-mots qui contiennent 'Tagada' : c'est suffisant pour attirer l'oeil de l'utilisateur.

    2) A propos de "est-ce rapide ?" : Tout dépend de ce que tu entends par "rapide" mais s'il y a seulement 3000 boucles comme signalé au début c'est relativement rapide : suffit de chronométer.

    3) A propos de "- Avant le vidage ? est-ce possible ?" : Oui-MAIS bigrement plus compliqué : cela nécessiterait de transformer le MemoryStream qui à l'arrivée est du texte brut en un MemoryStream dans lequel on insèrerait tout le charbia de formattage caractéristique du format RTF pour pouvoir faire un LoadFromStream dans le RichEdit d'un seul coup avec son formattage.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup pour l'aide.
    A trés bientôt.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/10/2011, 15h23
  2. Corriger les lenteurs d'affichage
    Par dam_moreyllo dans le forum Zend Studio
    Réponses: 9
    Dernier message: 07/12/2006, 16h25
  3. [WinForms]Lenteur d'affichage formulaire avec image de fond
    Par olixelle dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/09/2006, 14h06
  4. lenteur d'affichage des données
    Par Mak2S dans le forum Delphi
    Réponses: 1
    Dernier message: 11/07/2006, 14h16
  5. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54

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