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

API, COM et SDKs Delphi Discussion :

retour à la ligne automatique dans un TCanvas


Sujet :

API, COM et SDKs Delphi

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut retour à la ligne automatique dans un TCanvas
    Bonjour,

    je cherche à afficher un long texte dans un Tcanvas, et je voudrais que les retour à la ligne se fasse automatiquement (afin que le texte apparaissent entièrement et sur plusieurs ligne).

    Tous ce que je trouve c'est de rogner le texte qui ne rentre pas dans les dimensions du Tcanvas.

    Meric de votre aide.

  2. #2
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut
    Je ne penses pas que ça soit possible puisque, pour faire un retour à la ligne, il faut connaître la longueur du Canvas, ce qui est parfois impossible, puisque la taille et les coordonnées ne sont pas présentent dans le Canvas, mais par éxemple dans le composant TImage ...

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    C'est pas vraiment ce que tu veux, mais ceci peut t'aider:
    http://www.developpez.net/forums/vie...r=asc&start=15

    Bon developpement.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Je vais essayé, mais je cherche également à ne souligner (ou change la font) sur une partie du texte. Ca marche avec le textout, car je récupere les données de position. Mais là je ne vois pas comment faire

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Tu as une solution simple :
    Tu ecris dans un mémo invisible (que tu rends visible pour la mise au point) avec la bonne taille, la bonne police et la propriété Wordwrap.
    Ensuite tu récupéres les lignes du memo
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    sur l'API DrawText et tu trouveras toutes les infos que tu veux
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut Re: retour à la ligne automatique dans un TCanvas
    Citation Envoyé par richard038
    Bonjour,

    je cherche à afficher un long texte dans un Tcanvas, et je voudrais que les retour à la ligne se fasse automatiquement (afin que le texte apparaissent entièrement et sur plusieurs ligne).

    Tous ce que je trouve c'est de rogner le texte qui ne rentre pas dans les dimensions du Tcanvas.

    Meric de votre aide.
    Voici un exemple de WordWrap fait à l'aide de l'API DrawText qui pourrait t'aider (enfin moi ça m'a aidé souvent )

    http://homepages.borland.com/efg2lab.../2000/0329.txt

    -Slimjoe
    -Slimjoe

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Merci,

    Mais ce que je cherche à faire, c'est de souligner ou de changer la couleur d'un ou plusieurs mots d'un TCanvas.

    Avec TextOut, j'écris en plusieurs fois avec des polices différentes, car j'ai la position du "curseur" après chaque appel à la fonction; Le seul hic, c'est que ça n'écrit le texte que sur une seul ligne.

    Avec DrawText, je en peux écrire le text en plusieurs fois.

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Ah ça se complique...

    Si tu as la bibliothèque JVCL, va voir les sources du composants TJvHTLabels, qui fait ce que tu cherches à faire. Ca te donnera sans doute des idées.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Ben_Le_Cool
    C'est pas vraiment ce que tu veux, mais ceci peut t'aider:
    http://www.developpez.net/forums/vie...r=asc&start=15

    Bon developpement.
    Je te conseilles fortement la solution proposée ici
    (Merci Ben )
    Bidouilleuse Delphi

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Le drawText, ne va pas pour moi puisque je veux afficher plusieurs couleurs dans le texte.

    La solution que j'ai trouvé est d'utiliser TextOut, et combiner à un Trect pour avoir les dimensions du canvas et faire moi-même les retour à la ligne.

    Merci de votre aide

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Il y a peut-être mieux...

    Voici la solution que je te propose :

    Tout d'abord voici une FAQ Delphi que j'ai rédigé début février et qui sera dans bientôt incluse dans la FAQ Delphi (Je l'avais oublié celle-là !
    )
    [QR] Comment avoir les dimensions (largeur/hauteur) en pixels d'un texte formaté (rtf) ?

    Voici une fonction qui permet :
    - soit d'afficher le contenu d'un TRichEdit dans un TCanvas (mettre RenderIt à True, dans les limites d'un Rectangle donné Rect)
    - soit de mesurer la taille du texte (RenderIt à False, dimensions du Rectangle donné renvoyées dans Rect)


    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
     
    uses Windows,Forms,Graphics, RichEdit, ComCtrls;
    ...
     
    function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
                          ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint;
    var  Range    : TFormatRange;
    begin
        //Précaution
        SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0);
     
        if not RenderIt then
        begin
          SetRect(ARect,0,0,ARichEdit.Width,ARichEdit.Height);
        end;
     
        FillChar(Range, SizeOf(TFormatRange), 0);
        Range.hdc        := ACanvas.handle;
        Range.hdcTarget  := ACanvas.Handle;
        Range.rc.left    := ARect.Left * 1440 div Screen.PixelsPerInch;
        Range.rc.top     := Arect.Top * 1440 div Screen.PixelsPerInch;
        Range.rc.right   := ARect.Right * 1440 div Screen.PixelsPerInch;
        Range.rc.Bottom  := ARect.Bottom * 1440 div Screen.PixelsPerInch;
        Range.chrg.cpMax := ToChar;
        Range.chrg.cpMin := FromChar;
        if RenderIt
        then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range))
        else begin
               Range.chrg.cpMax := ARichedit.GetTextLen;
               Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range));
               ARect:=Range.rc;
               ARect.Bottom  := Range.rc.Bottom * Screen.PixelsPerInch div 1440;
             end;
       SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
    end;
    Utilisation :
    ACanvas (TCanvas) :
    Un Canvas qui sert à "dessiner" le texte formaté (celui d'un TBitmap que l'on a créé pour l'occasion par exemple)
    FromChar, ToChar (integer) :
    Index du premier et dernier Caractère du texte à prendre en compte pour mesurer le texte (mettre Tochar à -1 pour prendre le dernier caractère du texte)
    ARichEdit (TRichEdit) :
    Le TRichEdit qui contient le texte formaté
    RenderIt (boolean) et var ARect (TRect) :
    True : on dessine vraiment le texte formaté dans ACanvas, dans les limites du Rectangle Rect passé en paramètre.
    False : on mesure le texte et on renvoie ses dimensions dans Rect

    La fonction retourne l'index du dernier caractère qui tient dans le Rectangle Rect plus 1 (donc Index_du_dernier_caractère+1)

    Exemple :
    On mesure la taille complète du texte (index de 0 à -1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var ARect:TRect;
    PrintToCanvas(Form1.Canvas,0,-1,RichEdit1,ARect,false);
    et voici une unité qui en tire parti :
    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
    Unit RTFdansCANVAS;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, stdctrls, comctrls, richedit
     
    type
      TVAlignment = (vtaBottom, vtaCenter, vtaTop);
     
    procedure DrawTextArea(Canvas: TCanvas; ARect : TRect;ARichEdit : TRichEdit; VAlignment:TVAlignment );
     
    implementation
    function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
                          ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint;
    var  Range    : TFormatRange;
    begin
        //Précaution
        SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0);
     
        if not RenderIt then
        begin
          SetRect(ARect,0,0,ARichEdit.width,ARichEdit.height);
        end;
     
        FillChar(Range, SizeOf(TFormatRange), 0);
        Range.hdc        := ACanvas.handle;
        Range.hdcTarget  := ACanvas.Handle;
        Range.rc.left    := ARect.Left * 1440 div Screen.PixelsPerInch;
        Range.rc.top     := Arect.Top * 1440 div Screen.PixelsPerInch;
        Range.rc.right   := ARect.Right * 1440 div Screen.PixelsPerInch;
        Range.rc.Bottom  := ARect.Bottom * 1440 div Screen.PixelsPerInch;
        Range.chrg.cpMax := ToChar;
        Range.chrg.cpMin := FromChar;
        if RenderIt
        then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range))
        else begin
               Range.chrg.cpMax := ARichedit.GetTextLen;
               Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range));
               ARect:=Range.rc;
               ARect.Bottom  := Range.rc.Bottom * Screen.PixelsPerInch div 1440;
             end;
       SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
    end;
     
    function GetTextSize(ARichEdit : TRichEdit): TSize;
    var ARect:Trect;
    begin
      PrintToCanvas(Canvas,0,-1,ARichEdit ,ARect,false);
      Result.cx := ARect.Right-Arect.Left;
      Result.cy := ARect.Bottom-ARect.Top;
    end;
     
    procedure RTFPaint(Canvas:TCanvas;ARect:TRect;ARichEdit : TRichEdit);
    begin
       PrintToCanvas(Canvas,0,-1,ARichEdit,ARect,true);
    end;
     
    procedure DrawTextArea(Canvas: TCanvas; ARect : TRect;ARichEdit : TRichEdit; VAlignment:TVAlignment );
    var Rect:TRect;
        ASize:TSize;
        dh,dy:integer;
      procedure DrawText;
      begin
        Canvas.Pen.Color := Canvas.Brush.Color;
        Canvas.Rectangle(ARect.Left,ARect.Top,ARect.Right,ARect.Bottom);
        Canvas.Brush.Style := bsClear;
        RTFPaint(Canvas,Rect,ARichEdit);
        Canvas.Brush.Style := bsSolid;
        Canvas.Font.Color := clBlack;
      end;
    begin
      ASize:=GetTextSize(ARichEdit);
      rect:=ARect;
      dh:=(ARect.Bottom-ARect.Top)-ASize.cy;
      if dh<0 then dh:=0;
      dy:=0;
      if VAlignment=vtaBottom then dy:=dh;
      if VAlignment=vtaCenter then dy:=dh div 2;
      OffsetRect(rect,0,dy);
      DrawText;
    end;
    end.
    Tout ce dont tu as besoin, c'est donc d'un TRichEdit que tu places sur ta fiche avec sa propriété Visible=false , par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      with RichEditInvisible do
      begin
         Visible := False;
         Width := 0;
         Height := 0;
         WordWrap := true;
         BorderStyle := bsNone;
         PlainText := false;
      end;
    end;
    Puis tu crées ton texte dans ce richedit, par code, et tu utilises DrawTextArea (exemple de l'aide Delphi) :
    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
    begin
    with RichEditInvisible do
    begin
    Parent :=Self;
    Align :=alClient;
    Lines.Clear;
    //Définit le style d'énumération
    Paragraph.Numbering :=nsBullet;
    Lines.Add('Introduction');
    Lines.Add('Nouveaux membres de notre équipe');
    Lines.Add('Nouvelle discussion du budget');
    Lines.Add('Assistance');
    Lines.Add('Q &R');
    Paragraph.Numbering :=nsNone;
     
    Paragraph.Alignment :=taCenter;
    Lines.Add('');
    Lines.Add('Suggestions :');
    Lines.Add('');
    Paragraph.Alignment :=taLeftJustify;
    Paragraph.FirstIndent :=10;
    Lines.Add('');
    Lines.Add('Réparation du parking');
    Lines.Add('Réduction des coûts');
    end;
     
    DrawTextArea(TonCanvasdeDestination, UnRectangle,RichEditInvisible ,vtaCenter);
    end;
    Avec comme paramètres pour DrawTextArea :
    TonCanvas : Ton Canvas dans lequel dessiner le texte
    UnRectangle : Rectangle du Canvas Dans Lequel Doit Tenir Ton Texte
    VALignement : alignement vertical dans le rectangle

    Je pense que tu devrais pouvoir en faire quelque chose
    Bidouilleuse Delphi

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Merci de votre aide.
    J'ai trouvé une solution assez simple à partir de TextOut, d'un TRect et d'un second Tcanvas pour "mesurer" la taille.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/03/2020, 23h20
  2. [FPDF] Retour à la ligne automatique dans une cellule
    Par franchesko62 dans le forum Bibliothèques et frameworks
    Réponses: 18
    Dernier message: 08/12/2016, 11h42
  3. retour à la ligne automatique dans php-eclipse
    Par Severance dans le forum Eclipse PHP
    Réponses: 4
    Dernier message: 29/03/2009, 16h14
  4. [FireFox 3]Retour à la ligne automatique dans un <Legend>
    Par Benzeghiba dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 17/07/2008, 17h05
  5. Retour à la ligne automatique dans les div
    Par Delphy113 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/02/2006, 10h42

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