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

 Delphi Discussion :

police symbol dans RichEdit


Sujet :

Delphi

  1. #1
    Membre du Club

    Inscrit en
    Novembre 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 69
    Points : 62
    Points
    62
    Billets dans le blog
    1
    Par défaut police symbol dans RichEdit
    J'utilise les symboles de couleur de cartes ♣ ♦ ♥ ♠.
    Pour cela habituellement on prend les caractères de 167 à 170 de la police "symbol".
    Alors que cela marche pour certains composants comme Drawgrid, cela ne semble pas marcher pour les RichEdit qui pourtant acceptent des polices aussi bizarre que "Blade runner Movie"!
    J'y arrive en utilisant la police "IMG Symbols" mais j'ai peur que cette police ne soit pas installée sur les ordinateurs pour lesquels le programme est distribué.
    Quelqu'un sait-il pourquoi la police "Symbol" ne marche pas avec les RichEdit?
    alors que cela marche avec d'autres composants?
    (Les grecs doivent pourtant en avoir besoin!)
    Y a-t-il un moyen de faire que cela marche?
    J'utilise Turbo Delphi comme EDI.

  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 266
    Points
    3 266
    Par défaut
    Salut,

    Y a-t-il un moyen de faire que cela marche?
    ... Oui, voiçi du code :


    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    // Gestion RichEdit --------------------------------------------------------
    // Pour ajouter à la suite du texte d'un RichEdit, ou pour y insérer n'importe
    // où,  du texte normal, ou en indice, ou en exposant avec possibilité de 
    // changer nom-taille-couleur-style-de-police à chaque appel.
    // ------------------------------------------------------------------------
     
    // ne pas oublier de mettre RichEdit dans le uses de l'unité.
     
    type      TCharPos = (Indice, Exposant, Normal);
     
    procedure redParagraph( RE : tRichEdit; Alig : char; MargeG,Retrait,MargeD : Longint);
    //        Ali = g c ou d selon gauche, centré, droite
    //        MargeG,Retrait,MargeD = Marges et Retrait pour le paragraphe
    begin     RE.SelStart:=length(RE.text);
              with RE.Paragraph do
              begin case alig of
                         'c' : Alignment := taCenter;
                         'd' : Alignment := taRightJustify;
                         'g' : Alignment := taLeftJustify;
                    end;
                    LeftIndent  := MargeG;
                    FirstIndent := Retrait;
                    RightIndent := MargeD;
                    Numbering:=nsNone; //<- remplaçable par un chr de WingDings, ou WebDings, etc
              end;
              RE.Update;
    end;
     
    procedure RedSelectionEnIndiceExposant(RE : TRichEdit; CharPos : TCharPos);
    //            Met le texte sélectionné en indice, exposant ou en position normale
    var       Format: TCharFormat; // infos sur formattage de caractères RichEdit (voir SDK Win)
              DeltaY : integer;
    begin     DeltaY := abs((55*RE.Font.Size) div 8);
              FillChar(format, SizeOf(Format), 0);
              with Format do
              begin cbSize := SizeOf(Format);
                    dwMask := CFM_OFFSET; // Pour positionnement deltaY du caractère
                    case CharPos of
                         Exposant : yOffset := DeltaY;  //<- en twips 1 twip = 1/1440 pouce ou 1/20 point.
                         Normal   : yOffset := 0;
                         Indice   : yOffset := -DeltaY; //négatif en twips
                    end;
              end;
              // Transfert du formattage des caractères dans la sélection du RichEdit
              SendMessage(RE.Handle, EM_SETCHARFORMAT, SCF_SELECTION, LPARAM(@Format))
    end;
     
    procedure RedSuiteText( RE : TRichEdit; s : string; CharPos : TCharPos; FontName : string; SizeFont : integer;
                            Styl : tFontStyles; Coul : TColor);
    //            Ajoute la string 's' à la fin du texte avec les attributs des paramètres
    var       ss : integer;
    begin     ss:=length(re.text); if (ss>0) and (re.text[ss]=#10) then dec(ss);
              with RE do
              begin if ss=0 then lines.add('');
                    SelStart:=ss;
                    SelText:=s;
                    SelStart:=ss-1;
                    SelLength:=length(s);
              end;
              RedSelectionEnIndiceExposant(RE,CharPos);
              with Re.SelAttributes do
              begin name:=FontName; size:=SizeFont; Style:=Styl; color:=Coul; end;
              Re.SelLength:=0;
    end;
     
    procedure RedInsererText( RE : TRichEdit; s : string; Posit :  integer;
                             CharPos : TCharPos; FontName : string; SizeFont : integer;
                             Styl : tFontStyles; Coul : TColor);
    //           Insère la string 's' à la position Posit du texte avec les attributs des paramètres
    var       lg : integer;
    begin     lg:=length(s);
              with RE do
              begin SelStart:=Posit;
                    selText:=s;
                    SelStart:=Posit;
                    SelLength:=lg;
                    RESelectionEnIndiceExposant(RE,CharPos);
                    with SelAttributes do
                    begin name:=FontName; size:=SizeFont; Style:=Styl; color:=Coul; end;
                    SelStart:=Posit+lg;
                    SelLength:=0;
              end;
    end;
    Exemple d'utilisation :

    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
    procedure TfrmTrace.SpeedButton4Click(Sender: TObject);
    var       i,TN,TIE : integer;
    begin     TN:=16; // ici TN = Taille normale
              TIE:=round(TN*3/5); // TIE = taille des caractères en Indice ou Exposant
              REd2.clear; //<- REd2 est un TRichEdit
              RedSuiteText(REd2,'FF',normal,'Arial',TN,[],clBlack);
              RedSuiteText(REd2,'i',indice,'Arial',TIE,[],clRed);
              RedSuiteText(REd2,' = a',normal,'Arial',TN,[],clBlack);
              RedSuiteText(REd2,'i',indice,'Arial',TIE,[],clRed);
              RedSuiteText(REd2,'.x',normal,'Arial',TN,[],clBlack);
              RedSuiteText(REd2,'22',exposant,'Arial',TIE,[fsBold],clBlue);
     
              REd2.lines.add(' ');
              for i:=1 to 5 do
              begin RedSuiteText(REd2,#13#10+chr(240),normal,'WingDings',12,[],clRed);
                    RedSuiteText(REd2,' Tagada '+intToStr(i),normal,'Arial',12,[],clBlue);
              end;
              redParagraph(red2,'g', 0, 60, 0);
              red2.lines.add('');
              for i:=139 to 144 do
              begin RedSuiteText(REd2,#13#10+chr(i),normal,'WingDings',12,[],clRed);
                    RedSuiteText(REd2,' Tagada '+intToStr(i),normal,'Arial',12,[],clBlue);
              end;
              red2.lines.add('');
              for i:=167 to 170 do RedSuiteText(REd2,#13#10+chr(i),normal,'Symbol',12,[],clRed); //<<<<<<<<<<<< voiçi la Symbol
    end;
    ... Testé marche (Delphi-5 + WinXp)

    A+

  3. #3
    Membre du Club

    Inscrit en
    Novembre 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 69
    Points : 62
    Points
    62
    Billets dans le blog
    1
    Par défaut Précisions
    Merci de ta réponse avec de nombreuses possibilités que je vais tester.
    Il y manque toutefois les définitions de TCharFormat, EM_SETCHARFORMAT, SCF_SELECTION...
    Je comprends ce que tu fais et si ce que j'ai fait est beaucoup plus simple
    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
    Function AfficherCode(S: String; fenêtre: TRichEdit): integer;
    var StylePrec: TtextAttributes;
    begin
    with fenêtre do
    BEGIN
      Styleprec:= DefAttributes;
      RESULT:=SelStart;
      SelAttributes.Name:= 'IMG symbols';
      if (S = 'O') or (s='N') then
        SelAttributes.Color:= clred
      else
        SelAttributes.Color:= clBlack;
      SelText:= S;
      SelStart:= RESULT+1;
      SelAttributes:= StylePrec;
    END;
    end;
    cela fait ce que je veux.
    En revanche ce que je ne comprends pas, c'est que normalement, je devrais utiliser les chr de 167 à 170 de la police symbol pour avoir ♣ ♦ ♥ ♠ . Or cette police ne marche pas! je suis obligé de recourir à la police IMG Symbols qui malheureusement ne se trouve pas sur les ordinateurs de mes "clients"! alors qu'en général la police Symbol y est.
    Pourquoi la police symbol ne fonctionne-t-elle pas?
    Fonctionne-t-elle chez toi?

  4. #4
    Membre du Club

    Inscrit en
    Novembre 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 69
    Points : 62
    Points
    62
    Billets dans le blog
    1
    Par défaut
    J'ai décortiqué ton code en lui retirant tout ce qui me permettait de me rapprocher de ce que j'avais écrit et qui marchait avec la police IMG Symbols mais pas avec la symbol(!?). et je me suis rendu compte que la différence venait de ce que ton code insérait le texte puis faisait une sélection arrière puis définissait les attributs, alors que moi je le faisais en série: definition des attributs, insertion du texte et redéfinition des attributs pour la suite.
    En faisant comme toi cela marche. Mais alors pourquoi ce que j'ai fait marchait avec IMG Symbols et pas avec Symbol... Mystère!
    Enfin bon, merci. (Le plus drôle c'est que j'avais commencé comme toi, mais cela ne marchait pas pour sans doute une toute autre raison...)

  5. #5
    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 266
    Points
    3 266
    Par défaut
    Bonjour,

    Il y manque toutefois les définitions de TCharFormat ...
    ... il suffit d'ajouter 'RichEdit' dans le uses de l'unité d'ébergement vu qu'elles sont définies dans RichEdit.pas

    A mon avis ton code ne marchait pas à cause d'un oubli : Pour les symboles tels que WingDings, Symbol, WebDings il faut aussi changer le Charset : je parie que ton pb provenait de là. Essayes ceci pour voir.

    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
    Function AfficherCode(S: String; fenêtre: TRichEdit): integer;
    var StylePrec: TtextAttributes; 
    begin
    with fenêtre do
    BEGIN
      Styleprec:= DefAttributes;
      RESULT:=SelStart;
      SelAttributes.Name:= 'Symbol';
      SelAttributes.Charset:=SYMBOL_CHARSET;
      if (S = 'O') or (s='N') then
        SelAttributes.Color:= clred
      else
        SelAttributes.Color:= clBlack;
      SelText:= S;
      SelStart:= RESULT+1;
      SelAttributes:= StylePrec;
    END;
    end;
    A +

  6. #6
    Membre du Club

    Inscrit en
    Novembre 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 69
    Points : 62
    Points
    62
    Billets dans le blog
    1
    Par défaut Charset mais oui!
    Oui avec le CHARSET cela marche, merci!

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

Discussions similaires

  1. Texte formaté dans RichEdit & DBRichEdit
    Par dem dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/03/2021, 20h05
  2. utiliser plusieurs police différentes dans 1 mémo
    Par the_magik_mushroom dans le forum Composants VCL
    Réponses: 5
    Dernier message: 08/03/2006, 16h28
  3. Comment rechercher le symbol % dans un champ?
    Par nmathon dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2006, 17h01
  4. [JAR][POLICE] Utiliser une police ttf dans un fichier jar
    Par Doc.Fusion dans le forum Général Java
    Réponses: 3
    Dernier message: 26/01/2005, 12h23
  5. Inclure un type de police spécial dans un projet
    Par AOliv dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 27/06/2003, 09h39

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