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

Lazarus Pascal Discussion :

RichMemo et caractères ASCII > 128 [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 309
    Par défaut RichMemo et caractères ASCII > 128
    Bonjour,
    J'ai besoin d'un utiliser un RichMemo sous forme de treeview pour mettre en avant (en rouge) certaines parties du texte (ce qui suit le symbole &).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sMemo := RichMemo1.Lines.Text;
        iPosMariage := 0;
        while sMemo.IndexOf('&',iPosMariage) <> -1 do
        begin
          iPosMariage := sMemo.IndexOf('&',iPosMariage);
          if (sMemo[iPosMariage+1] <> '') then
            RichMemo1.SetTextAttributes(iPosMariage+1,4,aFontWedding);
          iPosMariage := iPosMariage+1
        end;
    Avec la fonction SetTextAttributes et le bon algo, ça se passe très bien :

    Nom : Capture d’écran du 2026-02-02 21-36-04.png
Affichages : 77
Taille : 13,6 Ko

    Là où ça se corse, c'est qu'au lieu d'utiliser les accolades et crochets, je cherche à utiliser des caractères plus esthétiques (tels que ─,└,├ et ┬) pour que ça ait vraiment un aspect treeview
    Avec un memo standard, ça donne ça :

    Nom : Capture d’écran du 2026-02-02 21-45-30.png
Affichages : 75
Taille : 12,9 Ko

    Mais ces caractères sont stockés sur 3 octets donc :
    - Si j'alimente mon richmemo avec ces caractères PUIS que je cherche ensuite à changer la couleur, la fonction SetTextAttributes qui a besoin des positions ne s'applique pas au bon endroit (il y a un décalage dans les endroits colorisés).
    - Si je colorise proprement mes lignes PUIS que j'appelle des fonctions de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringReplace(RichMemo1.Lines.text,'-','─',[rfReplaceAll])
    pour remplacer les caractères 'pas beaux' par les 'beaux', je perds les attributs de ma ligne.

    Je n'ai pas trouvé de méthode pour intervenir sur mon richmemo sans impacter ses attributs. Si quelqu'un a une idée...

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 309
    Par défaut
    Le problème pourrait se résumer à : les fonctions de manipulation de string comme 'indexof' ne sont visuellement exactes que si le string ne contient que des caractères ascii inférieurs à 128

    Si le string1 vaut '--&----', length renvoie 7, IndexOf('&') qui alimente iPosMariage renvoit bien 2
    Si le string2 vaut '──&────', length renvoie 19, IndexOf('&') renvoit 6
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RichMemo1.SetTextAttributes(iPosMariage+1,4,aFontWedding);
    s'applique bien au string1, on obtiendrait '--&----'
    Pour le string2, il prend le 6ième caractère en comptant les caractères de la chaine sans distinction de la taille de chaque caractère de la chaine. Le rouge intervient avec un décallage.

    Donc, le bug serait plutôt dans les deux premiers paramètres de SetTextAttributes (textstart, textlen) qui ne tiennent pas compte de l'ASCII enrichi, non ?

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 310
    Par défaut
    Hello,
    il faut travailler les chaînes en UTF8 (avec l'unité LazUTF8) et pas en ascii.
    Fonction de Remplacement :
    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
    // Remplacement UTF‑8 sans perdre les attributs
    procedure TForm1.ReplaceCharInRichMemo(RM: TRichMemo; const OldChar, NewChar: string);
    var
      txt: string;
      p: Integer;
    begin
      txt := RM.Lines.Text;
      p := UTF8Pos(OldChar, txt);
      while p > 0 do
      begin
        RM.SelStart := p - 1;                 
        RM.SelLength := UTF8Length(OldChar);  
        RM.SelText := NewChar;                
        txt := RM.Lines.Text;                 
        p := UTF8Pos(OldChar, txt, p + UTF8Length(NewChar));
      end;
    end;
    Fonction de colorisation :
    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
    // Coloration après le symbole &
    procedure TForm1.Coloriser(RM: TRichMemo; AColor: TColor);
    var
      txt: string;
      p: Integer;
      Attr: TFont;
    begin
      Attr := TFont.Create;
      try
        Attr.Assign(RM.Font);
        Attr.Color := AColor;
        Attr.Style := Attr.Style + [fsBold];
        txt := RM.Lines.Text;
        p := UTF8Pos('&', txt);
        while p > 0 do
        begin
          RM.SetTextAttributes(p, 1, Attr);        
          RM.SetTextAttributes(p + 1, 4, Attr);    
          p := UTF8Pos('&', txt, p + 1);
        end;
      finally
        Attr.Free;
      end;
    end;
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Bouton Transformer
    procedure TForm1.ButtonTransformerClick(Sender: TObject);
    begin
      ReplaceCharInRichMemo(RichMemo1, '-', '─');
      ReplaceCharInRichMemo(RichMemo1, '+', '┬');
      ReplaceCharInRichMemo(RichMemo1, '{', '├');
      ReplaceCharInRichMemo(RichMemo1, '[', '└');
      Coloriser(RichMemo1, clRed);
    end
    Nom : RichMemoTV.gif
Affichages : 49
Taille : 104,9 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 309
    Par défaut
    Merci infiniment pour cette solution 'clef en main', Jurrassic !
    C'est brillamment expliqué et illustré, tu as du y consacrer pas mal de temps, ce en quoi je redouble de remerciements.
    Je n'avais pas connaissance de cette unité LazUTF8, honte à moi.
    Effectivement, ton code a pu être intégré, et il résout mon problème.
    Bonne fin de journée.

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

Discussions similaires

  1. [TPW] Affichage des caractères Ascii 128 à 255
    Par dimi2 dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 26/03/2008, 10h55
  2. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 02h27
  3. Ascii DOs -> Ascii Windows
    Par remixtech dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2003, 08h14
  4. Conversion binaire -> ASCII
    Par will13013 dans le forum C
    Réponses: 8
    Dernier message: 08/01/2003, 05h12
  5. exporter la structure d'une base Sybase en ascii
    Par Jean-Cyp dans le forum Sybase
    Réponses: 5
    Dernier message: 05/11/2002, 17h15

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