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 Text Color dynamic


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti Avatar de Soulama
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 619
    Points : 416
    Points
    416
    Par défaut TrichEdit Text Color dynamic
    Bonjour,

    Je suis en train d'écrire un log-reader avec Delphi 2010.
    Le logiciel doit colorer la ligne actuelle par rapport aux String contenus dedans :
    Logic:
    if line.contains( "error" ) line.color = red else line.color = black.
    J'ai vu quelques exemples avec TRichEdit qui fonctionnent bien.
    Ma question:
    y a-t-il un event que je peux utiliser pour réaliser la logique décrite en haut?

    Merci
    Apprends la science de celui qui sait, et enseigne ta science à celui qui ignore, comme ca, tu auras appris ce que tu ignores et utilisé ce que tu sais.

  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
    Bonjour,

    Voici un bout de code qui permet de colorier une ligne quelconque d'un RichEdit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure RE_ColorLine(ARichEdit: TRichEdit; ARow: Integer; AColor: TColor);
    begin
      with ARichEdit do
      begin
        SelStart := SendMessage(Handle, EM_LINEINDEX, ARow - 1, 0);
        SelLength := Length(Lines[ARow - 1]);
        SelAttributes.Color := AColor;
        SelLength := 0;
      end;
    end;
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      RE_ColorLine(RichEdit1, 4, clRed); // Passe la 4ième ligne en rouge
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre averti Avatar de Soulama
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 619
    Points : 416
    Points
    416
    Par défaut
    Merci pour la repense, je vais testé le code et donné des news.
    Apprends la science de celui qui sait, et enseigne ta science à celui qui ignore, comme ca, tu auras appris ce que tu ignores et utilisé ce que tu sais.

  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
    Bonjour,

    En fait ça s'utilise comme suit car la procedure RE_ColorLine(RE: TRichEdit; ARow: Integer; AColor: TColor) colorie la ligne numéro ARow avec ARow = Index + 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure RE_ColorerLignesSi(RE: TRichEdit; Mot: ShortString; AColor: TColor; var Count: integer);
    // Colorier toutes les occurrences des lignes si elles contiennent Mot, Count renvoie le nombre de lignes coloriées
    var i: Integer;
    begin
      Count := 0;
      for i := 0 to RE.Lines.Count - 1 do begin
        if pos(Mot, RE.Lines[i]) > 0 then begin RE_ColorLine(RE, i + 1, AColor); inc(count); end;
      end;
    end;
    Mais si tu veux colorier uniquement les occurrences du mot "error" au-lieu de colorier chaque fois toute la ligne voici une routine rapide :
    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
    33
    34
    35
    procedure RE_ColorerMots(RE: TRichEdit; Mot: ShortString; AColor: TColor; var Count: integer);
    //< Colorier toutes les occurences de Mot avec AColor, Count renvoie le nombre de mots coloriés
    // 3 secondes 838 ms pour colorier 4784 fois Mot dans Zola992K.txt de 992 Ko
    label Recomm;
    var
      pCherche, pTexte, pCour: PChar;
      tt: Integer; // Taille texte
    begin
      Count := 0;
      with RE do
      begin
        GetMem(pCherche, 1 + length(Mot));
        StrPCopy(pCherche, Mot);
        tt := RE.GetTextLen + 1;
        pTexte:=@RE.text[1];
        SetFocus;
    
        Recomm:
        // On commence à la position du Caret :
        pCour := pTexte + SelStart + SelLength;
        // Recherche :
        pCour := StrPos(pCour, pCherche);
    
        if pCour <> nil then
        begin
          inc(Count);
          SelStart := pCour - pTexte;
          SelLength := Length(Mot);
          SelAttributes.Color := AColor;
          goto Recomm;
        end;
        SelLength := 0;
        FreeMem(pCherche, 1 + length(Mot));
      end;
    end;
    Et voici une variante qui utilise RichEdit.FindText de Delphi 6 que j'ai abandonnée car 9,83 fois plus lente que la version précédente qui pédale avec des PChar :
    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
    procedure RE_ColorerMots(RE: TRichEdit; Mot: ShortString; AColor: TColor; var Count: integer);
    // 3 secondes 37 secondes 721 ms pour 4784 mots dans Zola992K.txt de 992 Ko
    label Recomm;
    var
      FoundAt: LongInt;
      StartPos, ToEnd: Integer;
    begin
      Count := 0;
      with RE 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;
     
        Recomm:
        ToEnd := Length(Text) - StartPos; // ToEnd indique la longueur entre StartPos et la fin du texte du RichEdit
     
        FoundAt := FindText(Mot, StartPos, ToEnd, [stMatchCase]);
        if FoundAt <> -1 then
        begin
          inc(Count);
          SetFocus;
          SelStart := FoundAt;
          SelLength := Length(Mot);
          SelAttributes.Color := AColor;
          StartPos := FoundAt + Length(Mot);
          if StartPos < length(Text) then goto Recomm;
        end;
        SelLength := 0;
      end;
    end;
    Avant d'appeler l'une de ces deux dernières routines il faut initialiser RicheEdit.SelStart:=0; sinon en cas de click intempestif dans le RichEdit la recherche ne commence qu'à partir du Caret

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

Discussions similaires

  1. Texte coloré en Cobol
    Par gearsofcha dans le forum Cobol
    Réponses: 4
    Dernier message: 10/05/2012, 22h44
  2. Faire des QStrings avec du texte coloré
    Par LittleWhite dans le forum Qt
    Réponses: 2
    Dernier message: 20/08/2009, 21h31
  3. Texte coloré dans un TRichEdit
    Par Shredder dans le forum Composants VCL
    Réponses: 9
    Dernier message: 26/08/2008, 10h40
  4. Réponses: 4
    Dernier message: 15/04/2006, 22h47
  5. [Text]Coloration syntaxique
    Par tomca dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 12/01/2006, 12h23

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