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 :

Comment manipuler un memo?


Sujet :

Delphi

  1. #21
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Petit cadeau d'un truc qui utilise la mise en forme du richedit pour afficher du xml mieux que dans Internet Explorer. Et en plus ça fusionne du xml avec du xsl ( voir boutons valider )

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    procedure ArbreVersRichEditXML (const RE1 : TRichEdit ; const trv1 : TTreeView ) ;
    var
      st1,st2 : string ;
      c2 : TColor ;
     
      procedure Lecture ( n1 : TTReeNode ) ;
      var
        i1 : integer ;
     
        function Espace ( const n1 : TTReeNode ) : string ;
        var
          i1 : integer ;
        begin
          result := '' ;
          if n1.level > 1 then
            for i1 := 2 to n1.level do
              result := result + '  ' ;
        end ;
     
        procedure Ecrit (c1 : TColor; st1 : string ) ;
        begin
          if c1 = clBlack then
            RE1.SelAttributes.Style := [fsBold]
          else
            RE1.SelAttributes.Style := [] ;
          RE1.SelAttributes.Color := c1;
          RE1.SelText := st1 ;
        end ;
     
      begin
        with TElementTRVXML (n1.Data) do
        begin
          case TypeElement of
            te_element :
            begin
              Ecrit (clblue,#13#10+Espace(n1)+'<') ;
              c2 :=  clMaroon ; // à priori
              if (Length(Element) > 4) and (pos('xsl:',lowercase(Element))>0) then
                c2 := clred ;
              Ecrit (c2,Element) ;
              for i1 := 0 to Attributs.Count - 1 do
              begin
                Ecrit (c2,' '+Attributs.Names[i1]) ;
                Ecrit (clblue,'="') ;
                st1 := Attributs.Values[Attributs.Names[i1]] ;
                if length(st1)>2 then
                  Ecrit (clblack,Copy (st1,2,length(st1)-2)) ;
                Ecrit (clblue,'"') ;
              end ;
              st1 := '>' ;
              if (n1.count=0) and (Valeur='') then  st1 := '/>' ;
              Ecrit (clblue,st1) ;
              if Valeur<>'' then
              begin
                st1 := Valeur ;
                while pos(#10,st1)>0 do delete (st1,pos(#10,st1),1) ;
                while pos(#13,st1)>0 do delete (st1,pos(#13,st1),1) ;
                st1 := trim (st1) ;
                Ecrit (clblack,st1) ;
                if length(st1)<=64 then st2 := '' else st2 := #13#10+Espace(n1) ;
                if (n1.count=0) then
                begin
                  Ecrit (clblue,st2+'</') ;
                  Ecrit (c2,Element) ;
                  Ecrit (clblue,'>') ;
                end ;
              end ;
            end ;
            te_comment :
            begin
              st1 := '<!--'+Valeur+'-->' ;
              Ecrit (clblue,#13#10+st1) ;
            end ;
            te_document_type :
            begin
              st1 := Valeur ;
              Ecrit (clgreen,#13#10+st1) ;
            end ;
            te_processing_instruction :
            begin
              st1 := '<?'+Element ;
              if Element<>'xml' then st1 := #13#10+st1 ;
              for i1 := 0 to (Attributs.Count -1) do
                st1 := st1 + ' ' + Attributs[i1] ;
              Ecrit (clblue,st1+'?>') ;
            end ;
          end ;
        end ;
        for i1 := 0 to (n1.Count-1) do Lecture (n1.item[i1]) ;
     
        RE1.SelAttributes.Color := clRed;
        if (n1.count>0) and (n1.parent<>Nil) then
        begin
          Ecrit (clblue,#13#10+Espace(n1)+'</') ;
          c2 :=  clMaroon ; // à priori
          st1 := TElementTRVXML (n1.Data).Element ;
          if (Length(st1) > 4) and (pos('xsl:',lowercase(st1))>0) then
            c2 := clred ;
          Ecrit (c2,st1) ;
          Ecrit (clblue,'>') ;
        end ;
      end ;
     
     
    begin
      RE1.Lines.Clear ;
      c2 := clMaroon ;
      Lecture (trv1.Items[0]) ;
      //RE1.Lines.SaveTofile('R1.rtf') ;
    end;

  2. #22
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    @ Gilbert Geyer :

    Je suis toujours intéressé par ta méthode pour le formatage. Je suis curieux et bien que je serai capable de le faire, j'aimerai voir ta solution

  3. #23
    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
    A Ero-sennin : Comme souhaité, voici mon approche pour le formatage :
    (c'est la même approche que celle illustrée par le code de mon message du 19/06/2007 17h06 sauf que j'ai remplacé ici la StringList 'motsEvidence' par une TObjectList pour la transmission des paramètres)

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    //RichEdit : Formattage de un ou plusieurs mots d'une ligne à ajouter à la volée
    //           avec possibilité de faire varier police-taille-style-et-couleur dans la même ligne.
    ....................
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
        uses Contnrs;
     
        type  TMotSelAttr = class
              public
                mot   : string; Name : tFontName; Size : integer; Style : tFontStyles;
                Color : tColor;
                constructor Create( iMot   : string;  iName  : tFontName;
                                    iSize  : integer; iStyle : tFontStyles;
                                    iColor : tColor);
              end;
     
              TListeMotSelAttr = class(TObjectList)
              private  function  GetItem(Index: Integer): TMotSelAttr;
                       procedure SetItem(Index: Integer; const Value: TMotSelAttr);
              public
                       function Add(AObject: TMotSelAttr): Integer;
                       property Items[Index: Integer]: TMotSelAttr read GetItem write SetItem; default;
              end;
     
    constructor TMotSelAttr.Create( iMot   : string;  iName  : tFontName;
                                    iSize  : integer; iStyle : tFontStyles;
                                    iColor : tColor);
    begin       Mot  :=iMot;    Name:=iName; Size:=iSize;
                Style:=iStyle; Color:=iColor;
    end;
     
    function  TListeMotSelAttr.Add(AObject: TMotSelAttr): Integer;
    begin     result := inherited Add(AObject); end;
     
    function  TListeMotSelAttr.GetItem(Index: Integer): TMotSelAttr;
    begin     result := TMotSelAttr(inherited GetItem(index)); end;
     
    procedure TListeMotSelAttr.SetItem(Index: Integer; const Value: TMotSelAttr);
    begin     inherited setItem(index, value); end;
     
    //-------- Procédure d'injection du formattage dans le RichEdit : -------------
     
    procedure RichEditAjouterEnEvidence( var richEd : tRichEdit; Ligne : string;
                                         motsEvidence : TListeMotSelAttr);
    var       i,StartPos : integer;
    begin     StartPos:=Length(richEd.Text);
              with richEd do
              begin Lines.add(Ligne);
                    for i:=0 to motsEvidence.count-1 do
                    begin SelStart:=richEd.FindText(motsEvidence.items[i].Mot,StartPos,Length(Text)-StartPos,[stWholeWord]);
                          SelLength:=length(motsEvidence.items[i].Mot);
                          with SelAttributes do
                          begin Name:=motsEvidence.items[i].Name;
                                Size:=motsEvidence.items[i].Size;
                                Style:=motsEvidence.items[i].Style;
                                Color:=motsEvidence.items[i].Color;
                          end;
                          //StartPos:=StartPos+SelLength;
                          SelLength:=0;
                          update;
                    end;  
              end;
    end;
     
    //--------- Exemples d'utilisation : ----------------------------------
     
    procedure TForm1.bVersRichEdClick(Sender: TObject); //< bVersRichEd est un Bouton
    var       motsEvidence : TListeMotSelAttr; ligneAAjouter : string;
    begin
              motsEvidence := TListeMotSelAttr.Create(true);
              //----- 1ère ligne
              ligneAAjouter:='motA motB motC motD';
              with motsEvidence do
              begin Add(TMotSelAttr.Create('motA','Arial',         10,[fsBold],clRed));
                    Add(TMotSelAttr.Create('motC','Verdana',        9,[],clYellow));
                    Add(TMotSelAttr.Create('motD','Comic Sans MS', 10,[fsItalic],clNavy));
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence);
     
              //----- 2ème ligne : avec Wingdings "flèche" et "téléphone"
              ligneAAjouter:=chr(240)+' passer un coup de '+chr(40)+' à Nénette';
              with motsEvidence do
              begin Clear;
                    Add(TMotSelAttr.Create(chr(240),'Wingdings',11,[fsBold],clPurple));
                    Add(TMotSelAttr.Create('passer','Verdana',   9,[fsBold],clTeal));
                    Add(TMotSelAttr.Create(chr(40),'Wingdings', 11,[fsBold],clPurple));
                    Add(TMotSelAttr.Create('Nénette','Courrier', 12,[fsUnderline],clMaroon));
     
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence);
     
              //----- Nième ligne
              ligneAAjouter:='ligne entièrement en évidence';
              with motsEvidence do
              begin Clear;
                    Add(TMotSelAttr.Create(ligneAAjouter,'Verdana',9,[fsBold],clFuchsia));
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence);
     
              //----- N+1ième ligne
              ligneAAjouter:='ligne sans mise en évidence';
              motsEvidence.Clear;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence);
     
              motsEvidence.Free;
    end;
     
    end.
    ... A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #24
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Pas mal du tout ça! C'est niquel

    J'essaierai de faire un truc dans le même style, histoire de m'amuser un peu!
    Sinon, ça fonctionne très bien, je vais même le garder dans mon petit dossier trucs et astuces

  5. #25
    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
    Hier j'ai voulu y ajouter le formattage du "surligner" d'un mot d'un RichEdit en testant plusieurs fonctions citées dans les labyrinthes du forum aucune n'a marché chez moi (Win98+Delphi5) par contre en faisant un essai avec un copier de texte formatté sous Word (avec surlignage, indices, exposants, tableau) puis collé dans un RichEdit :
    - le surlignage n'a pas été accepté pa le RichEdit,
    - les indices, exposants ont été acceptés,
    - le texte des cellules du tableau a été accepté, mais les traits des cellules ont disparu.
    ... il reste donc encore la possibilté d'ajouter au code le formattage du positionnement d'une partie d'un mot en indice ou en exposant.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #26
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    C'est vrai, ça peut toujours être intéressant! Aussi, je suis entrain de voir pour que l'on puisse mettre une ligne entière à droite, au centre au à gauche, selon ce que l'on veut.

    J'essaie de voir comment faire, pour le moment je ne parviens pas centrer une seule ligne. Je continue à chercher du TAlignement ...


  7. #27
    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
    pour le moment je ne parviens pas centrer une seule ligne.
    ... il y a pourtant un exemple dans l'aide de Delphi.
    ... en bref :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        RichEdit1.Paragraph.Alignment := taCenter;
        RichEdit1.Paragraph.Alignment := taLeftJustify;
        RichEdit1.Paragraph.Alignment := taRightJustify
        Paragraph.FirstIndent := 25; // pour élargir ou rétrécir 
        Paragraph.LeftIndent := 15; // les marges d'un pargraphe
        Paragraph.RightIndent := 15;// idem à droite
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #28
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ok! Merci, j'y était pas du tout, mais vraiment pas!!!

    Je cherchais dans cette direction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RichEdit.Alignement:=taCenter
    Je ne manipule pas encore bien le RichEdit, et pour ce qui est de l'aide, hé bien je suis passé à coté, tout simplement .

    Bon ba je vais m'y remettre dans un petit instant (une petite pause méritée m'attend )

    Merci pour ces infos

  9. #29
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    @Gilbert Geyer

    ça merite d'aller dans la
    en ajoutant l'alignement tant qu'a faire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #30
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    J'ai repris le code de Gilbert Geyer (merci ) et j'y ai rajouté l'alignement du texte concernant une ligne entière ! Je ne pense pas que ca soit très intéressant de la faire au mot près (à moins que vous y voyez une utilité ) Si c'est mot par mot, je pense qu'il faudra revoir le code en conséquence ...

    Voici le code, et en rouge, les modifs ...

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    type  TMotSelAttr = class
              public
                mot   : string; Name : tFontName; Size : integer; Style : tFontStyles;
                Color : tColor;
                constructor Create( iMot   : string;  iName  : tFontName;
                                    iSize  : integer; iStyle : tFontStyles;
                                    iColor : tColor);
              end;
    
              TListeMotSelAttr = class(TObjectList)
              private  function  GetItem(Index: Integer): TMotSelAttr;
                       procedure SetItem(Index: Integer; const Value: TMotSelAttr);
              public
                       function Add(AObject: TMotSelAttr): Integer;
                       property Items[Index: Integer]: TMotSelAttr read GetItem write SetItem; default;
              end;
    
    constructor TMotSelAttr.Create( iMot   : string;  iName  : tFontName;
                                    iSize  : integer; iStyle : tFontStyles;
                                    iColor : tColor);
    begin       Mot  :=iMot;    Name:=iName; Size:=iSize;
                Style:=iStyle; Color:=iColor;
    end;
    
    function  TListeMotSelAttr.Add(AObject: TMotSelAttr): Integer;
    begin     result := inherited Add(AObject); end;
    
    function  TListeMotSelAttr.GetItem(Index: Integer): TMotSelAttr;
    begin     result := TMotSelAttr(inherited GetItem(index)); end;
    
    procedure TListeMotSelAttr.SetItem(Index: Integer; const Value: TMotSelAttr);
    begin     inherited setItem(index, value); end;
    
    procedure RichEditAjouterEnEvidence( var richEd : tRichEdit; Ligne : string;
                                         motsEvidence : TListeMotSelAttr;Centrage:TAlignment);
    var       i,StartPos : integer;
    begin     StartPos:=Length(richEd.Text);
              with richEd do
              begin
                    Paragraph.Alignment:=centrage;
                    Lines.add(Ligne);
                    for i:=0 to motsEvidence.count-1 do
                    begin SelStart:=richEd.FindText(motsEvidence.items[i].Mot,StartPos,Length(Text)-StartPos,[stWholeWord]);
                          SelLength:=length(motsEvidence.items[i].Mot);
                          with SelAttributes do
                          begin Name:=motsEvidence.items[i].Name;
                                Size:=motsEvidence.items[i].Size;
                                Style:=motsEvidence.items[i].Style;
                                Color:=motsEvidence.items[i].Color;
                          end;
                          //StartPos:=StartPos+SelLength;
                          SelLength:=0;
                          update;
                    end;  
              end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var       motsEvidence : TListeMotSelAttr; ligneAAjouter : string;
    begin
              motsEvidence := TListeMotSelAttr.Create(true);
              //----- 1ère ligne
              ligneAAjouter:='motA motB motC motD';
              with motsEvidence do
              begin Add(TMotSelAttr.Create('motA','Arial',         10,[fsBold],clRed));
                   Add(TMotSelAttr.Create('motC','Verdana',        9,[],clYellow));
                  Add(TMotSelAttr.Create('motD','Comic Sans MS', 10,[fsItalic],clNavy));
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taLeftJustify);
    
              //----- 2ème ligne : avec Wingdings "flèche" et "téléphone"
              ligneAAjouter:=chr(240)+' passer un coup de '+chr(40)+' à Nénette';
              with motsEvidence do
              begin Clear;
                    Add(TMotSelAttr.Create(chr(240),'Wingdings',11,[fsBold],clPurple));
                    Add(TMotSelAttr.Create('passer','Verdana',   9,[fsBold],clTeal));
                    Add(TMotSelAttr.Create(chr(40),'Wingdings', 11,[fsBold],clPurple));
                    Add(TMotSelAttr.Create('Nénette','Courrier', 12,[fsUnderline],clMaroon));
    
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taRightJustify);
    
              //----- Nième ligne
              ligneAAjouter:='ligne entièrement en évidence';
              with motsEvidence do
              begin Clear;
                    Add(TMotSelAttr.Create(ligneAAjouter,'Verdana',9,[fsBold],clFuchsia));
              end;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taLeftJustify);
    
              //----- N+1ième ligne
              ligneAAjouter:='ligne sans mise en évidence';
              motsEvidence.Clear;
              RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taCenter);
              motsEvidence.Free;
    end;
    Voilà! Reste à voir pour l'exposant et l'indice maintenant!

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

    A SergioMaster :
    ça merite d'aller dans la Faq
    Faut voir car il s'agit d'une syntèse de bouts de code trouvés dans le labyrinthe de ce Forum et réaccomodés la principale innovation provient du fait que j'utilise une TObjectList pour transmettre les paramètres de formattage aux routines d'exécution, en plus de ceci je viens d'encasuler le code des routines d'exécution dans un object TPiloterRichEd pour le cas où l'on veut utililiser ce code pour piloter le formattage de plusisuers RichEdit.
    Donc pour la mise dans la Faq, je peux toujours proposer, les modérateurs aviseront.

    A Ero-sennin : Alignements (et marges, etc) :
    ...Je ne pense pas que ca soit très intéressant de la faire au mot près
    ... non et de toutes façons on peut fixer à la propriété RichEdit1.Paragraph.Tab[Index: Byte] des taquets de tabulation en cas de besoin.

    A propos de la modif que t'as apportée au code : t'aurais pu simplfier en remplaçant l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taCenter);
    ... par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence);
    RichEdit1.Paragraph.Alignment := taCenter;
    ... et ceci pour les deux raisons suivantes :
    - n'envoyer les paramètres de Paragraph que pour le ou les paragraphe(s) visé(s).
    - pouvoir modifier n'importe quelle propriété de Paragraph en cas de besoin : Exmple : si on ne fixe pas les marges internes du RichEdit sa méthode Print ira tartiner le texte sur la quasi totalité de la page excepté en dehors des marges techniques. Faut donc que j'ajoute au moins un bout de code pour fixer des marges par défaut raisonnables.

    En attendant voici déjà le code actuel avec les alignements dissociés et avec les indices/exposants.
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    unit uPiloterRichEdit;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, Buttons, 
      RichEdit,
      Printers,
      Contnrs;
     
    type
      TfrmPiloterRichEdit = class(TForm)
        bVersRichEdit: TSpeedButton;
        RichEdit1: TRichEdit;
        bIndice: TSpeedButton;
        bExposant: TSpeedButton;
        bImprimer: TSpeedButton;
        procedure bVersRichEditClick(Sender: TObject);
        procedure bIndiceClick(Sender: TObject);
        procedure bExposantClick(Sender: TObject);
        procedure bImprimerClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      frmPiloterRichEdit: TfrmPiloterRichEdit;
     
    type  TCharPosDY = (Indice, Exposant, Normal);
     
    type  TMotSelAttr = class
          public
             mot   : string; Name : tFontName; Size : integer; Style : tFontStyles;
             Color : tColor; CharPosDY : TCharPosDY;
             constructor Create( iMot   : string;  iName      : tFontName;
                                 iSize  : integer; iStyle     : tFontStyles;
                                 iColor : tColor;  iCharPosDY : TCharPosDY);
          end;
     
          TListeMotSelAttr = class(TObjectList)
          private
             function  GetItem(Index: Integer): TMotSelAttr;
             procedure SetItem(Index: Integer; const Value: TMotSelAttr);
          public
             function Add(AObject: TMotSelAttr): Integer;
             property Items[Index: Integer]: TMotSelAttr read GetItem write SetItem; default;
          end;
     
          type TPiloterRichEd = object
             RichEdCible   : tRichEdit;
             MotsEtFormats : TListeMotSelAttr;
             procedure   Init( iRichEdCible : tRichEdit);
             procedure   AddFormat(Ligne : string);
             //procedure   SurlignerSelection(iColor: TColor);
             procedure   SelectionEnIndiceExposant(CharPosDY : TCharPosDY);
             procedure   ImprimerTout;
             procedure   Fini;
          end;
     
    implementation
     
    {$R *.DFM}
     
    // --- TMotSelAttr -------------------------------------------------------------
     
    constructor TMotSelAttr.Create( iMot   : string;  iName      : tFontName;
                                    iSize  : integer; iStyle     : tFontStyles;
                                    iColor : tColor;  iCharPosDY : TCharPosDY);
    begin       Mot  :=iMot;   Name:=iName;   Size:=iSize;
                Style:=iStyle; Color:=iColor; CharPosDY:=iCharPosDY;
    end;
     
    // --- TListeMotSelAttr --------------------------------------------------------
     
    function  TListeMotSelAttr.Add(AObject: TMotSelAttr): Integer;
    begin     result := inherited Add(AObject); end;
     
    function  TListeMotSelAttr.GetItem(Index: Integer): TMotSelAttr;
    begin     result := TMotSelAttr(inherited GetItem(index)); end;
     
    procedure TListeMotSelAttr.SetItem(Index: Integer; const Value: TMotSelAttr);
    begin     inherited setItem(index, value); end;
     
    // --- TPiloterRichEd ----------------------------------------------------------
     
    procedure TPiloterRichEd.Init( iRichEdCible : tRichEdit);
    begin     RichEdCible:=iRichEdCible;
              MotsEtFormats:=TListeMotSelAttr.Create(true);
    end;
     
    procedure TPiloterRichEd.AddFormat(Ligne : string);
    var       i,PosDeb,lgFin,PosTrouv : integer;
    begin     PosDeb:=Length(richEdCible.Text);
              with richEdCible do
              begin Lines.add(Ligne);
                    for i:=0 to MotsEtFormats.count-1 do
                    begin lgFin := Length(Text) - PosDeb;
                          if SelLength <> 0 then PosDeb := SelStart + SelLength;
                          PosTrouv:=FindText(MotsEtFormats.items[i].Mot,PosDeb,lgFin,[]); // stWholeWord : incompatible avec indices/exposants
                          if PosTrouv=-1
                          then showMessage( 'Mot à formatter : '+MotsEtFormats.items[i].Mot+' : non trouvé'+#13#10
                                           +'vérifier l''ordre des déclarations de formattage des mots')
                          else begin
                                 SelStart:=PosTrouv;
                                 SelLength:=length(MotsEtFormats.items[i].Mot);
                                 if MotsEtFormats.items[i].CharPosDY<>Normal
                                 then SelectionEnIndiceExposant(MotsEtFormats.items[i].CharPosDY);
                                 with SelAttributes do
                                 begin Name :=MotsEtFormats.items[i].Name;
                                       Size :=MotsEtFormats.items[i].Size;
                                       Style:=MotsEtFormats.items[i].Style;
                                       Color:=MotsEtFormats.items[i].Color;
                                 end;
                                 update;
                          end;
                    end;  
              end;
    end;
     
    procedure TPiloterRichEd.SelectionEnIndiceExposant(CharPosDY : TCharPosDY);
    var       Format: TCharFormat; // infos sur formattage de caractères RichEdit (voir SDK Win)
    begin
              FillChar(format, SizeOf(Format), 0);
              with Format do
              begin cbSize := SizeOf(Format);
                    dwMask := CFM_OFFSET; // Pour positionnement deltaY du caractère
                    case CharPosDY of
                         Exposant : yOffset := 55;  //positif en twips 1 twip = 1/1440 pouce ou 1/20 point.
                         Normal   : yOffset := 0;
                         Indice   : yOffset := -55; //négatif en twips
                    end;
              end;
              // Transfert du formattage des caractères dans la sélection du RichEdit
              SendMessage(RichEdCible.Handle, EM_SETCHARFORMAT, SCF_SELECTION, LPARAM(@Format))
    end;
     
    procedure TPiloterRichEd.ImprimerTout;
    begin       // Ajouter un bout de code por fixer des marges d'impressio
                  RichEdCible.Print('imprRichEdit');
    end;
     
    procedure TPiloterRichEd.Fini;
    begin        MotsEtFormats.Free;
    end;
     
    // ------ Exemples d'Utilisation -----------------------------------------------
    var       piloteRED : TPiloterRichEd;
    procedure TfrmPiloterRichEdit.bVersRichEditClick(Sender: TObject);
    var       ligneAAjouter : string; i : integer;
    begin
              piloteRED.Init(RichEdit1);
     
              //----- 1ère ligne
              ligneAAjouter:='avec marges additionnelles motA motB motC motD';
              with piloteRED.MotsEtFormats do
              begin Add(TMotSelAttr.Create('motA','Arial',         10,[fsBold],clRed,Normal));
                    Add(TMotSelAttr.Create('motD','Comic Sans MS', 10,[fsItalic],clNavy,Normal));
                    //motD déclaré ici dans l'ordre incorrect d'apparition pour déclecher message d'erreur
                    Add(TMotSelAttr.Create('motC','Verdana',        9,[],clYellow,Normal));
              end;
              piloteRED.AddFormat(ligneAAjouter);
              // Pour cette ligneAAjouter : On fixe des marges gauche+droite + Alignement
              // En l'absence de marges additionnles la méthode Print imprime dans le rectangle
              // interne aux marges techniques
              with piloteRED.RichEdCible.Paragraph do
              begin Alignment:=taLeftJustify;
                    FirstIndent:=25;
                    RightIndent:=15;
              end;
     
              //----- 2ème ligne avec Wingdings "flèche" et "téléphone"
              ligneAAjouter:=chr(240)+' passer un coup de '+chr(40)+' à Nénette';
              with piloteRED.MotsEtFormats do
              begin Clear;
                    Add(TMotSelAttr.Create(chr(240),'WingDings',   9,[fsBold],clTeal,Normal));
                    Add(TMotSelAttr.Create(chr(40),'WingDings',    9,[],clNavy,Normal));
                    Add(TMotSelAttr.Create('Nénette','Courrier', 12,[fsUnderline],clMaroon,Normal));
              end;
              piloteRED.AddFormat(ligneAAjouter);
              // Pour cette ligneAAjouter : On fixe se contente de centrer le texte :
              piloteRED.RichEdCible.Paragraph.Alignment:=taCenter;
     
              //----- 3ème ligne avec indices et exposants
              ligneAAjouter:='an.xn +an-1.xn-1 + ... + ap.xp + ... + a0 = 0';
              with piloteRED.MotsEtFormats do
              begin Clear;
                    Add(TMotSelAttr.Create('n','Arial',   8,[],clBlack,Indice));
                    Add(TMotSelAttr.Create('n','Arial',   8,[],clBlack,Exposant));
                    Add(TMotSelAttr.Create('n-1','Arial', 8,[],clBlack,Indice));
                    Add(TMotSelAttr.Create('n-1','Arial', 8,[],clBlack,Exposant));
                    Add(TMotSelAttr.Create('p','Arial',   8,[],clBlack,Indice));
                    Add(TMotSelAttr.Create('p','Arial',   8,[],clBlack,Exposant));
                    Add(TMotSelAttr.Create('0','Arial',   8,[],clBlack,Indice));
              end;
              piloteRED.AddFormat(ligneAAjouter);
              piloteRED.RichEdCible.Paragraph.Alignment:=taRightJustify; //<
     
              //----- Nième ligne
              ligneAAjouter:='ligne entièrement en évidence';
              with piloteRED.MotsEtFormats do
              begin Clear;
                    Add(TMotSelAttr.Create(ligneAAjouter,'Verdana',9,[fsBold],clTeal,Normal));
              end;
              piloteRED.AddFormat(ligneAAjouter);
     
              //----- N+1ième ligne
              ligneAAjouter:='ligne sans mise en évidence';
              piloteRED.MotsEtFormats.Clear;
              piloteRED.AddFormat(ligneAAjouter);
     
              { Pour voir la liste des WingDings puis des WebDings : déverrouiller la mise en commentaire
              //----- N+2ième ligne WingDings
              ligneAAjouter:='';
              for i:=33 to 255 do ligneAAjouter:=ligneAAjouter+chr(i);
              with piloteRED.MotsEtFormats do
              begin Clear;
                    Add(TMotSelAttr.Create(ligneAAjouter,'WingDings',14,[],clNavy,Normal));
              end;
              piloteRED.AddFormat(ligneAAjouter+#13#10);
     
              //----- N+2ième ligne WebDings
              with piloteRED.MotsEtFormats do
              begin Clear;
                    Add(TMotSelAttr.Create(ligneAAjouter,'WebDings',14,[],clNavy,Normal));
              end;
              piloteRED.AddFormat(ligneAAjouter);  }
     
              //piloteRED.Fini;
    end;
     
    // ------- Indice - Exposant sur sélection à la souris :
     
    procedure TfrmPiloterRichEdit.bIndiceClick(Sender: TObject);
    begin     piloteRED.SelectionEnIndiceExposant(Indice);end;
     
    procedure TfrmPiloterRichEdit.bExposantClick(Sender: TObject);
    begin     piloteRED.SelectionEnIndiceExposant(exposant); end;
     
    // ------- Imprimer  :
     
    procedure TfrmPiloterRichEdit.bImprimerClick(Sender: TObject);
    begin     if length(piloteRED.richEdCible.Text) > 0
              then piloteRED.ImprimerTout;
    end;
     
    END.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #32
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Citation Envoyé par Gilbert Geyer
    A propos de la modif que t'as apportée au code : t'aurais pu simplfier en remplaçant l'instruction
    Code :

    RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence,taCenter);

    ... par
    Code :

    RichEditAjouterEnEvidence(RichEdit1,ligneAAjouter,motsEvidence); RichEdit1.Paragraph.Alignment := taCenter;

    ... et ceci pour les deux raisons suivantes :
    - n'envoyer les paramètres de Paragraph que pour le ou les paragraphe(s) visé(s).
    - pouvoir modifier n'importe quelle propriété de Paragraph en cas de besoin : Exmple : si on ne fixe pas les marges internes du RichEdit sa méthode Print ira tartiner le texte sur la quasi totalité de la page excepté en dehors des marges techniques. Faut donc que j'ajoute au moins un bout de code pour fixer des marges par défaut raisonnables.
    Oui, c'est vrai. Moi je calculé pour chaque ligne alors que si on reste aligné à droite sur 25 par exemple, je devrais rajouter 25 fois le paramètre pour le centrage alors qu'un seul suffirait.

    Pour ce qui est du code, je vois qu'il a une toute autre allure ... du moins d'après ce que j'ai pu voir

    Pour le moment, je n'ai pas trop de temps dispo pour regarder ta nouvelle source cependant, je suis certains qu'elle fonctionnera .

    En tout cas, j'en apprends pas mal sur le RichEdit via ce post!
    Merci pour tes explications !

  13. #33
    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,
    A Ero-sennin : Je suis en-train de fignoler l'unité avec l'histoire des marges qu'on est obligé de déclarer dans le RichEdit de sorte que le Print ne tartine pas sur toute la page-papier mais c'est agaçant car du coup les marges vides apparaissent également à l'écran et un écran c'est vite encombré et dans le cas présent l'encombrement est augmenté avec des marges vides ... à moins de re-coder ou de modifier le Print de sorte que l'on n'ajoute les marges qu'au moment du Print ... galère ... donc faut que médite un peu sur ce sujet avant de continuer d'autant plus que les marges haute+basse ne peuvent pas être fixées par les propriétés de paragraph...
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #34
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Gilbert Geyer

    Je n'ai pas encore trouvé le temps pour regarder ta source En ce moment c'est plutôt assez difficile :s

    Pour l'histoire des marges, il est clair qu'il vaudrait mieux le coder de façon interne pour ne pas grignoter sur l'écran ... mais heu là je suis un peu larguer, je l'avoue ... (bé oui, j'apprends au fur et à mesure ).

    Pour l'histoire des marques, tu veux le gérer juste dans le cadre de l'impression finale... donc le faire à la façon Word en définissant les marges gauches et droites, haut et bas ?

    Pour la bordure de gauche, ca devrait aller, pour le haut aussi je pense.
    A gauche, on joue avec l'indentation.
    En haut, on ajoute des lignes vides mais faut gérer les épaisseurs ... pour le reste... pour l'instant je vois pas trop

  15. #35
    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
    A Ero-sennin : Salut
    Je suis sur un truc similaire pour ne déclarer les marges d'impression que sur le canvas du Printer mais ça oblige à coder toute l'impression ... un peu galère Je voulais faire un truc simple ... alors qu'avec ceci ça va être un peu dans le style usine-à-gaz! Mais quand faut'y-aller, ben faut'y-aller, on mettra le temps qu'il faut.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #36
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    A Gilbert Geyer :

    Bonsoir,

    Pour ce qui est des marges, on peut sans doute faire simple pour l'impression, notamment en ce qui concerne les marges gauche et droite (haut et bas par la suite).

    La chose à faire serait de travailler avec un Richedit Source, donc celui que l'on voit à l'écran et un RichEdit d'impression invisible pour l'utilisateur. Ainsi, pour l'impression, on reformate le texte en tenant compte des marges sans pour autant qu'elle soit visible.

    J'ai fait un truc vite fait, mais le soucis, c'est de garder le texte formaté en mémoire... Je pense que ma méthode est loin d'être bonne mais bon, c'est une idée que j'ai exploité, donc je la soumet ...

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, Clipbrd;
     
    type
      TForm1 = class(TForm)
        RichEdit1: TRichEdit;
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure Print(rich:TRichEdit;margeD,margeG,margeH,margeB:integer);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Print(rich:TRichEdit;margeD,margeG,margeH,margeB:integer);
    var
    RichEditPrint:TRichEdit;
    i:integer;
    begin
      RichEditPrint:=TRichEdit.Create(Self);
      RichEditPrint.Left:=10;
      RichEditPrint.Top:=10;
      for i:=0 to rich.Lines.Count-1 do
      begin
        Clipboard.AsText:=rich.Lines.Strings[i];
        rich.Paragraph.RightIndent:=margeD;
        rich.Paragraph.LeftIndent:=margeG;
        RichEditPrint.Lines.Add(Clipboard.AsText);
      end;
      //RichEditPrint.Print('Test');
      RichEditPrint.Free;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    RichEdit1.Paragraph.Alignment:=taCenter;
    RichEdit1.Lines.Add('Test1');
    RichEdit1.Paragraph.Alignment:=taLeftJustify;
    RichEdit1.Lines.Add('Test2');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Print(RichEdit1,10,10,0,0);
    end;
     
    end.
    La, il faudrait que je puisse garde le formatage ... mais bon je n'y suis pas parvenu et je ne me suis pas plus attardé ...

    Je te souhaite bon courage pour ton usine à gaz lol

  17. #37
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Pour conserver le formatage, il faut sauver la totalité du RichEdit dans un Stream....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var
      StrStrm:TMemoryStream;
    begin
      StrStrm:=TMemoryStream.Create;
      RichEdit1.SelectAll;
      RichEdit1.Lines.SaveToStream(StrStrm);
      StrStrm.Position:=0;
      Memo1.Lines.LoadFromStream(StrStrm);
      StrStrm.Free;
    end;
    Voilà...

  18. #38
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut petitprince

    Merci pour cette info. J'ai une idée qui me vient à l'esprit... Je teste voir

    [EDIT]:

    Bon ba ... c'est pas bon. Avec ta méthode petit prince, on peut pas récupérer le formatage ligne par ligne? Car le but c'est de pouvoir appliquer l'indentation à chaque ligne tout en conservant le formatage d'origine ...

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

    A Ero-sennin et Petitprince :

    Du plus simple au plus compliqué :

    - A) Une solution de simplicité serait d'envoyer après un SelectAll (c'est le SelectAll cité par Petitprince qui me fait penser à cela) le contenu du RichEdit dans le presse-papier et un click sur bouton Imprimer envoie un message "Pour imprimer ouvrir Word, coller le presse-papier dans Word, et imprimer avec Word" (Word désignant ici n'importe quel traitement de texte qui accepte le format .rtf).

    - B) Une solution presque aussi simple serait que le click-Imprimer déclenche un SelectAll, puis envoie dans cette sélection des valeurs de marges avec paragraph.FirstIndent:=margeG et paragraph.RightIndent:=margeD, puis lance l'impression avec la méthode Print, ... et en fin d'impression on remet les marges du RichEdit et le SelLength à 0. Inconvénient, on ne maîtrise pas les marges haute et basse, donc c'est tout juste bon pour sortir un brouillon, sauf si le texte fait moins d'une page.

    - C) Et moi je suis parti sur un truc où les marges son fixées au mm à la demande puis corrigées en fonction des marges techniques de l'imprimante puis converties pour le canvas du Printer ... et comme les dialogBoxes d'impression de Delphi-5 sont ringards j'ai commencé par utiliser un dialog-personnalisé avec les moyens du bord ... autrement dit tout cela rajoute des lignes de code.... Et comme SergioMaster était intéressé par mettre le truc dans la Faq je crains que ce soit un peu trop lourd car le thème de départ était le pilotage du formattage du RichEdit alors que je suis sur une voie où le nombre de lignes de code dédiées à l'impression risque d'être aussi important que celui du code dédié au formattage ... Après tout rien ne m'empêche de continuer et en cas de besoin revenir à la solution B s'il le faut pour la Faq.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  20. #40
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    A Gilbert Geyer

    Bonjour,

    Je viens de lire tes solutions et honnêtement, la A je ne la trouve pas très intéressante du fait qu'il faut un programme annexe ...
    Je suis plus tourné vers la B pour la question de simplicité.

    Moi, j'essayé de garder le formatage ligne à ligne mais apparemment, ce n'est pas faisable ... du moins ce n'est pas aussi simple que je le pensais (voir ma méthode du post précédent).

    J'arrive à copier la mise en forme d'une ligne du RichEdit mais pas par programmation ... Je vais essayer de voir cela cette aprem si j'ai le temps!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/10/2005, 18h47
  2. comment manipuler la couche alpha d'un .png
    Par bilel dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/07/2005, 14h40
  3. [Audio] Comment manipuler un fichier PCM
    Par max44410 dans le forum C++Builder
    Réponses: 16
    Dernier message: 22/05/2005, 17h33
  4. Comment manipuler un DataSource de OpenOffice.org ?
    Par dyvim dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 26/04/2005, 09h29
  5. [PDFBox]Comment manipuler une LIST
    Par marcotop dans le forum Documents
    Réponses: 11
    Dernier message: 27/08/2004, 15h46

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