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 :

Texte coloré dans un TRichEdit


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut Texte coloré dans un TRichEdit
    bonjour,

    je dispose dans mon application d'un rich edit, et je fais un "loadfromfile".

    après cela, j'aimerais que certains mots, qui soient dans une liste, apparaissent dans une couleur différente.

    comment puis-je faire ceci simplement ?

    merci d'avance

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut ,

    Pour faire une coloration syntaxique (certain mots en couleur), je te recommande SynEdit comme composant, c'est un bon éditeur.. . Sinon fait une recherche sur le forum, il me semble qu'un composant a été créé par NONO40 pour faire aussi de la coloration syntaxique.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  3. #3
    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
    Bonjour,

    Tu peux également trouver à la fin de cette page (post du 27/06/2007, 16h47 ) : http://www.developpez.net/forums/d35...anipuler-memo/
    le fichier téléchargeable PiloterRichEdit.zip
    qui contient une unité de pilotage du formattage (Police, Taille, Style, Couleur, Indice, Exposant) mot par mot d'une ligne à ajouter à la suite dans un RichEdit. (Pour générer des états enrichis même avec des Wingdings ou des Webdings).

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

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Jette également un coup d'oeil sur ce thread. Tu trouveras la réponse sur comment changer la couleur d'un mot dans un richedit.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    ok j'ai réussi a faire la coloration syntaxique, merci beaucoup

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    Je tiens quand même à montrer mon code, au cas où certains seraient interessés. Je me suis grandement inspiré de celui de Gilbert que j'ai pu voir dans le topic précédent

    J'ai du le modifier un peu car dans mon programme je n'ajoute pas du texte ligne par ligne, mais avec un loadfromfile, après lequel j'appelle :

    redAjouterEnEvidence(richedit1,motsEvidence,clRed);

    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
    procedure tform1.redAjouterEnEvidence( var richEd : TRichEdit; motsEvidence : tStringList; iColor: tColor);
    var
      i : integer;
      position:integer;
      next_pos:integer;
    begin
      for i:=0 to motsEvidence.count-1 do begin //pour tous les mots dans la liste
        position:=0;           //on se place au début
        next_pos:=0;           //de même
        repeat
          position:=richEd.FindText(motsEvidence[i],next_pos,length(richedit1.Text),[stMatchCase]);   //on recherche dans tout le texte
          if position=-1 then                          //si aucun résultat, alors on passe au mot suivant
            break;
          next_pos:=position+length(motsEvidence[i]); //la prochaine fois on cherchera à partir de après ce mot (sinon on va changer sa couleur en boucle ^^)
          richEd.SelStart:=position;                  //on se place donc au début du mot
          richEd.SelLength:=length(motsEvidence[i]);  //on séléctionne ce mot
          richEd.SelAttributes.Color := iColor;       //on change la couleur
          richEd.SelLength:=0;                        //on retire la séléction
          richEd.update;
        until 1=2;                       //il y a eu un résultat car on n'a pas breaké, donc on continue à chercher
      end;
    end;
    Et la procédure s'occupe directement de mettre en rouge tous les mots du texte qui sont présents dans la stringlist.
    Si vous voyez une erreur ou une amélioration éventuelle, faites moi signe

  7. #7
    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,

    A vue d'oeil : pas vu d'erreur. La seule amélioration, à mon avis, serait de dissocier la routine de la Form1, et de loger la routine dans une unité du style "caisse à outils"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure tform1.redAjouterEnEvidence( var richEd : TRichEdit; motsEvidence : tStringList; iColor: tColor);
    var ...
    begin ....
    end;
    deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure redAjouterEnEvidence( var richEd : TRichEdit; motsEvidence : tStringList; iColor: tColor);
    var ...
    begin ....
    end;
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    ok en effet

    Par contre je viens de m'apercevoir que lorsqu'on charge des gros textes, mon code ralenti énormément :S

    N'y aurait-il pas une fonction du coup, qui permettrait de rechercher directement la position de toutes les occurences d'un texte ?

    ça accélérerait énormement la procédure.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Et bien il y a la superbe fonction SearchStringInBigFile du grand Mister ShaiLeTroll qui doit pouvoir t'aider
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  10. #10
    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
    Bonjour,

    1) La suggestion d'Aka Guymelef est effectivement très bonne car SearchStringInBigFile est environ 2,3 ou 2,5 fois plus rapide que SearchStringInFile (également de ShaiLeTroll ) et cette dernière doit être au moins aussi rapide voir plus que FindText. Je ne me souviens plus si on avait comparé à FindText, par contre je me souviens que ShaiLeTroll avait dit un jour que le passage du buffer de 1Ko vers 64Ko fait gagner 25% de performances, donc n'hésites pas à remplacer BUF_SIZE: Integer = 1024; par BUF_SIZE: Integer = 65536

    2) Autre suggestion d'amélioration, fonctionnelle celle-ci :
    Dans redAjouterEnEvidence( var richEd : TRichEdit; motsEvidence : tStringList; iColor: tColor); tu passes en paramètre iColor ce qui fait que l'enluminure est monocolore et comme motsEvidence est une StringList tu pourrais en profiter ( vu que le type tColor n'est rien d'autre qu'un integer) pour utiliser AddObject('mot1', Pointer(141821297)); puis AddObject('mot2', Pointer(14181616)); etc où le paramètre de Pointer() correspond à ton choix de couleurs ce qui permettrait de réaliser une enluminure multicolore ce qui améliore l'ergonomie visuelle s'il faut pouvoir distinguer rapidement des mots différents dans un texte de grande longueur ce qui semble être le cas vu que tu dis "lorsqu'on charge des gros textes ..."

    Et pour récupérer la valeur de la couleur planquée dans l'objet associé au mot situé à l'indice 'i' tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    richEd.SelAttributes.Color := integer(motsEvidence.Objects[i]);
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/03/2021, 16h05
  2. TrichEdit Text Color dynamic
    Par Soulama dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/03/2014, 13h39
  3. Réponses: 1
    Dernier message: 24/05/2011, 00h42
  4. Faire défiler du texte dans un TRichEdit
    Par engrobel dans le forum C++Builder
    Réponses: 7
    Dernier message: 04/11/2008, 20h33
  5. coloration dans une RichEditbox
    Par BillBarouf dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/03/2004, 19h59

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