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

Langage Delphi Discussion :

ecrire un texte a partir d'un point dans richedit


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut ecrire un texte a partir d'un point dans richedit
    bonjour;
    j'aimerai savoir comment écrire un texte (par exemple : 'mon texte') sur un richedit (lorsque je click sur un boutton) mais a une position bien précise dans richedit c'est a dire a partir d'un point bien défini.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure RichEdit_MoveTo(RichEdit: TRichEdit; LineNumber, CharNumber: Word);
    //             Pour positionner le Caret dans un RichEdit
    begin
    RichEdit.SelStart := RichEdit.Perform(EM_LINEINDEX, LineNumber, 0) + CharNumber;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    RichEdit_MoveTo(RichEdit1,2,5); //<- exemple plaçant le caret en Ligne 2 et à la poisition du caratère 5 en supposant qu'il y ait deux lignes de texte dans le richedit
    Application.ProcessMessages;
    RichEdit1.SetFocus;
    end;
    Le Caret étant positionné, si t'as par exemple du texte dans le presse-papier en faisant Ctrl+V le texte s'insère à la position du Caret.

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

  3. #3
    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,

    Je n'ai pas Delphi sous la main, mais essaie de voir du coté de la méthode Insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    richEdit1.Lines.Insert(Position,'MonTexte');
    Dis nous ce qu'il en ait

  4. #4
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    en fait ce que je veux c'est d'inserer 'montexte' a partir d'une position de type point (ou en pixels) et non pas a une position de type (numero de ligne et position de caractère).
    voyez vous un peu le problème?

  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 263
    Points
    3 263
    Par défaut
    Re,

    Voici ce que ça donne avec richEdit1.Lines.Insert(2,'MonTexte');

    Avant :

    ljddfksjflksjd 0
    slflkjsfdlkdj 1
    lmksfkdkfs 2

    Après :

    ljddfksjflksjd 0
    slflkjsfdlkdj 1
    MonTexte
    lmksfkdkfs 2

    cela insère une ligne entre deux autres
    mais ça n'insère pas le texte dans une ligne pré-existante
    mais ça peut peut-être répondre au besoin "a une position bien précise dans richedit c'est a dire a partir d'un point bien défini" car le début d'une ligne c'est bien une position bien précise : lol.

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

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    TCustomRichEdit implémente une méthode protected SetCaretPos qui devrait placer le curseur dans le RichEdit) et qui prend en paramètre un TPoint. Donc soit tu crées un composant qui dérive du TCustomEdit et tu rends cette méthode visible, soit tu récupère le code utilisé dans SetCaretPos pour l'utiliser directement dans ton code...
    Dans Delphi7 SetCaretPos est implémenté à la ligne 11530 de l'unité ComCtrls...

  7. #7
    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
    Re-bonjour,

    Tu peux télécharger ici un zip : http://www.developpez.net/forums/d35...anipuler-memo/
    ... qui contient une Unité de pilotage du formattage (Police, Taille, Style, Couleur, Indice, Exposant) mot par mot d'une ligne à ajouter à la suite dans un RichEdit. (Pour générer des états enrichis même avec des Wingdings ou des Webdings).

    Comme pour écrire en indice ou en exposant il faut positionner le caractère en un point bien précis d'une ligne tu peux y touver la routine suivante :

    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
    procedure TPiloterRichEd.SelectionEnIndiceExposant(CharPosDY : TCharPosDY);
    //            Postionne en indice, exposant, ou en position normale le texte préalablement sélectionné dans le RichEdit selon que CharPosDY vaut Indice, Normal, ou Exposantvar       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;
    ... ici le positionnement yOffset := 0; 55; ou -55 s'effectue relativement à la ligne du texte pré-selectionné donc le positionnement nécessite de présélectionne une ligne.
    Avec les RichEdit on ne peut pas accéder à un Canvas comme par exemple Form1.Canvas.TextOut(X,Y,'MonTexte') ... dommage car ça aurait été beaucoup plus simple.

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

  8. #8
    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,

    Tiens j'ai retrouvé un bout de code qui permet d'écrire un bout de texte a une position X,Y bien précise d'un Richedit ou d'un TMemo :

    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 TextOutCibleSansCanvas(Cible : tWinControl; Text : string; X,Y : Integer);
    var       DC : HDC;
              Fonte : HFONT;
    begin     DC := GetDC(Cible.Handle);  //Création d'un Device Context pour le Control
     
              SetBkMode(DC, TRANSPARENT); //Fond du texte transparent
     
              //Création de la fonte : Pour les paramètres voir aide en ligne
              Fonte := CreateFont( 0, 0, 0, 0, FW_NORMAL, 0, 0, 0,
                                  DEFAULT_CHARSET, 0, CLIP_DEFAULT_PRECIS,
                                  DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE,
                                  PChar('Arial'));
     
              SelectObject(DC, Fonte); //Création de la fonte et son assignation au DC
     
              TextOut(DC, X, Y, PChar(Text), Length(Text));
     
              //Suppression de la mémoire allouée pour les objets et le DC :
              DeleteObject(Fonte);
              ReleaseDC(Cible.Handle, DC);
    end;
     
    procedure TForm1.btnTexteClick(Sender: TObject);
    begin     TextOutCibleSansCanvas(Memo1,'Tagada tsoin-tsoin',30,45);
                TextOutCibleSansCanvas(RichEdit1,'Trucmuche tralala',60,88);
    end;
    Mais attention une fois que le texte est écrit, le moindre ajout via Richedit1.lines.Add() par exemple efface le texte préalablement écrit avec TextOutCibleSansCanvas ça oblige donc à être raffraîchi.

    A+.
    P.S : J'ai essayé de modifier le code afin de pouvoir passer le choix de la fonte avec sa couleur en paramètre d'entrée car si avec CreateFont on peut même écrire du texte incliné aucun paramètre de CreateFont ne parle de couleur de fonte. (et la couleur du CreatePen n'agit apparamment pas sur la fonte ou alors je me suis planté...)
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    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
    Re,

    Et voici une version améliorée pour écrire un bout de texte en X,Y d'un control sans Canvas mais ici avec Fonte passée en paramètre ainsi que l'angle d'inclinaison du texte :

    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
    procedure TextOutCibleSansCanvas2( Cible : tWinControl; Texte : string;
                                       X,Y : integer; Fonte : tFont; AngleDD : word);
    //        Trace Texte incliné sur DC de la Cible avec angle en Dixièmes de degré
    var	  dc : HDC; lgFont : LOGFONT; HFonte : HFONT; Brush : HBRUSH; Pen : HPEN;
    begin	  DC := GetDC(Cible.Handle);
              // initialisation de la fonte
              zeroMemory(@lgFont,sizeOf(lgFont));
              strPCopy(lgFont.lfFaceName,Fonte.Name);
              lgFont.lfHeight := Fonte.Height;
              if Fonte.style=[]       then lgFont.lfWeight:=FW_REGULAR; //Normal
              if Fonte.style=[fsBold] then lgFont.lfWeight:=FW_BOLD;    //Gras
     
              if fsItalic in Fonte.style    then lgFont.lfItalic:=1;;
              if fsUnderline in Fonte.style then lgFont.lfUnderline:=1;;
              if fsStrikeout in Fonte.style then lgFont.lfStrikeout:=1;;
     
              lgFont.lfEscapement:=AngleDD; // modification de l'inclinaison
     
              HFonte := CreateFontInDirect(lgFont);
              SelectObject(dc,HFonte);
              // initialisation du contour : ici contour invisible
              Pen := CreatePen(PS_NULL,0,clNone);
              SelectObject(dc,Pen);
              // initialisation de la couleur de la police
              Brush := CreateSolidBrush(Fonte.Color);
              SelectObject(dc,Brush);
              // le contexte doit être transparent
              SetBkMode(dc,TRANSPARENT);
              // dessin du texe
              beginPath(dc);
              TextOut(DC,X,Y,PansiChar(Texte),length(texte));
              endPath(dc);
              StrokeAndFillPath(dc);
              // Restauration objet et libération mémoire
              DeleteObject(HFonte);
              //SelectObject(dc,AncBrush);
              DeleteObject(Brush);
    end; // TextOutCibleSansCanvas2
    Utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.btnTexteClick(Sender: TObject);
    begin     TextOutCibleSansCanvas2(Memo1,'Texte à 90°', 15,100, Edit1.font, 900);
              TextOutCibleSansCanvas2(Panel1,'Texte à 45°', 20,100,Edit1.font, 450);
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    @ramanov
    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.Button1Click(Sender: TObject);
    var
     C:Cardinal;
     M:TPoint;
     S :string;
    begin
       M.X :=30;
       M.Y :=5;
       S:='MonText';
       C:=RichEdit1.Perform(EM_CHARFROMPOS,0,DWORD(@M));
       RichEdit1.Perform(EM_SETSEL,C,C);
       RichEdit1.Perform(EM_REPLACESEL,0,DWORD(PChar(S)));
    end;
    @Gilbert Geyer ta fonction ne marche sur D7
    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
    procedure TextOutCibleSansCanvas2(Cible : tWinControl;const Texte : string;
                                       X,Y : integer; Fonte : tFont=nil);
    begin
       with TCanvas.Create do
       try
           Handle := GetDC(Cible.Handle);
           if Assigned(Fonte) then
           begin
             Font:= Fonte;
             Pen.Color :=Fonte.Color;
           end;
           Brush.Style :=bsClear;
           TextOut(X,Y,Texte);
           ReleaseDC(Cible.Handle, Handle);
       finally
         Free();
       end;
    end;

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

    Gilbert Geyer ta fonction ne marche sur D7
    ... Ok, j'aurais du préciser que j'utilise D5 où elle marche.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/03/2014, 10h25
  2. JTextPane, Ecrire du texte, Insérer images, et le tout dans une JScroll
    Par wilfryjules dans le forum Interfaces Graphiques en Java
    Réponses: 15
    Dernier message: 20/06/2011, 14h48
  3. Ecrire sur un fichier texte a partir d'un URL
    Par nazgul66 dans le forum Applets
    Réponses: 5
    Dernier message: 24/06/2009, 09h55
  4. Remplacer un texte dans une cellule Excel à partir d'un point donné
    Par tonyC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/04/2006, 19h05

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