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.
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.
Bonjour,
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.
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;
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Salut,
Je n'ai pas Delphi sous la main, mais essaie de voir du coté de la méthode Insert :
Dis nous ce qu'il en ait
Code : Sélectionner tout - Visualiser dans une fenêtre à part richEdit1.Lines.Insert(Position,'MonTexte');
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?
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
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...
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 :
... 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.
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;
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
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 :
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.
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;
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
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 :
Utilisation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
A+.
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;
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
@ramanov@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 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;
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;
Bonjour,
... Ok, j'aurais du préciser que j'utilise D5 où elle marche.Gilbert Geyer ta fonction ne marche sur D7
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager