Marge dans un RichEdit ? [Résolu]

arnaud_tournier 35 Messages postés jeudi 16 septembre 2004Date d'inscription 25 mars 2007 Dernière intervention - 20 nov. 2004 à 13:51 - Dernière réponse : ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention
- 20 nov. 2004 à 22:03
Hello everybody,

J aurais aimer savoir si quelqu un savait comment mettre la marge d 'un richedit d'un autre couleur que le richEdit et comment écrire dans cette marge. En fait, j aimerais pouvoir mettre les numéros de lignes dans le RichEdit comme la plupart des éditeurs de texte...

Merci d'avance....

Arnaud
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
arnaud_tournier 35 Messages postés jeudi 16 septembre 2004Date d'inscription 25 mars 2007 Dernière intervention - 20 nov. 2004 à 21:51
3
Merci
Merci pour votre aide les gars mais j'y suis arrivé, je vous donne le code source pour que ca puiss servir à quelqu un d autre....

unit UNewRichEdit;

interface

uses
Windows, Messages, RichEdit;

type
TNewRichEdit = class(TCustomRichEdit)
private
{ Déclarations privées }
FOnScroll: TNotifyEvent;
MARGINWIDTH : integer;
protected
procedure WndProc(var Msg: TMessage); override;
public
{ Déclarations publiques }
procedure CreateWnd(); override;
procedure drawMarge();
published
property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;
end;

implementation

{ TNewRichEdit }

procedure TNewRichEdit.CreateWnd;
begin
inherited;
SendMessage(Self.Handle, EM_SETWORDBREAKPROC, 0, LPARAM(@EditWordBreak));
LongRec(Margins).Lo := 30;
LongRec(Margins).Hi := 30;
MARGINWIDTH := TFrmChild(Parent).Canvas.TextWidth('0000') + 6;
SendMessage(Self.Handle, EM_SETMARGINS, EC_LEFTMARGIN,MARGINWIDTH);
end;

procedure TNewRichEdit.drawMarge;
var Rect : TRect;
sTmp : String;
Canvas : TCanvas;
iStart : integer;
iEnd : integer;
iHeightOneChar : integer;
iLineVisible : integer;
info: TScrollInfo;
iDec : integer;
begin
iHeightOneChar := TFrmChild(Parent).Canvas.TextHeight('0');
FillChar(info, SizeOf(info), 0);
with info do
begin
cbsize := SizeOf(info);
fmask := SIF_ALL;
GetScrollInfo(Handle, SB_VERT, info);
end;
iDec := 0;
iStart := Perform(EM_GETFIRSTVISIBLELINE,0,0) + 1;

Canvas := TCanvas.Create;
Canvas.Handle := GetWindowDC(Self.Handle);
Canvas.Font.Color := clWhite;
Canvas.Font.Name := Self.Font.Name;
Canvas.Font.Size := Self.Font.Size;
Canvas.Brush.Color := clGray;

iEnd := Perform(EM_GETLINECOUNT,0,0) + 1;
iLineVisible := 0;
sTmp := '';

while ((iLineVisible * iHeightOneChar < ClientHeight)) do
begin
if (iLineVisible >= iEnd - 1) then
begin
sTmp := sTmp + ' ' + #13#10;
end
else
begin
sTmp := sTmp + ' ' + IntToStr(iStart + iLineVisible) + #13#10;
end;
inc(iLineVisible);
end;
Rect.Top := 0;
Rect.Left := MARGINWIDTH - 3;
Rect.Right := MARGINWIDTH;
Rect.Bottom := ClientHeight;
Windows.FillRect(Canvas.Handle, Rect, GetStockObject(GRAY_BRUSH));
Rect.Left := 0;
Rect.Top := - iDec;
Rect.Right := MARGINWIDTH - 3;
Windows.DrawText(Canvas.Handle, PChar(sTmp), length(sTmp), Rect, DT_RIGHT);
Canvas.Font.Color := clBlack;
ReleaseDC(Self.Handle, Canvas.Handle);
FreeAndNil(Canvas);
end;

procedure TNewRichEdit.WndProc(var Msg: TMessage);
begin
inherited;
if Msg.Msg = WM_VSCROLL then
begin
drawMarge;
end
else if Msg.Msg = WM_PAINT then
begin
drawMarge;
end;
end;

end.

Arnaud

Merci arnaud_tournier 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de arnaud_tournier
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 20 nov. 2004 à 14:02
0
Merci
Je crains que la numérotation des lignes soit impossible. En effet, le RichEdit est un contrôle géré entièrement par une DLL (RichMachin32.dll). A mes dernières nouvelles, il n'y a pas de propriété Canvas dans le RichEdit. Même si tu voulais rajouter un dessinage de lignes, tu ne pourrais pas.

Une solution: utiliser TSynEdit. Mais c'est un éditeur PlainText (du TXT quoi, pas du RTF) pour de la syntaxe en programmation (exemple). Là, il y a numérotation de ligne...

En fait, le SynEdit est coupé en deux. La numérotation est une gouttière Alignée à gauche, l'éditeur est un texteur aligné en Client. Pour ce qui est du RichEdit, il n'y a pas de solution, à part d'essayer de superposer des composants. Mais alors, ça devient vraiment très moche. %-6

===========
Validez les réponses si ok...

ViewVite : HTML - ZIP
Commenter la réponse de cs_grandvizir
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 20 nov. 2004 à 15:39
0
Merci
Tu peux cependant utiliser ce code pour afficher la ligne où est situé le curseur dans un StatusBar par exemple...

@+
Bonne Prog'
Nico

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! :)
Commenter la réponse de ni69
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 20 nov. 2004 à 22:03
0
Merci
ok ;)

@+
Bonne Prog'
Nico
Commenter la réponse de ni69

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.