type
TMyRulerForRichMemo = class(TPaintBox)
protected
procedure Paint; override;
public
constructor Create(AOwnerRichMemo: TRichMemo); reintroduce; overload;
end;
constructor TMyRulerForRichMemo.Create(AOwnerRichMemo: TRichMemo);
begin
inherited Create(AOwnerRichMemo);
if AOwnerRichMemo.Parent = nil then exit;
Parent := AOwnerRichMemo.Parent;
Top := AOwnerRichMemo.Top;
Left := AOwnerRichMemo.Left;
Height := AOwnerRichMemo.Height;
Width := AOwnerRichMemo.Width;
AOwnerRichMemo.Transparent := True;
end;
procedure TMyRulerForRichMemo.Paint;
var
X, Q1, Q2: integer;
begin
Canvas.Brush.Color := clWhite;
Canvas.FillRect(0, 0, Width, Height);
Canvas.Pen.Color := clRed;
X := 1; // we begin at the top
while X < Canvas.Height do
begin
// first we determine the character at 1,1
Q1 := TRichMemo(Owner).CharAtPos(1, X); // EM_CHARFROMPOS
Q2 := Q1;
// next we are going down until the character is different
while (Q2 = Q1) and (X < Canvas.Height) do
begin
Inc(X);
Q2 := TRichMemo(Owner).CharAtPos(1, X); // EM_CHARFROMPOS
end;
// Yes... X is now at a new character so we have a new line
Canvas.Line(0, X, Width, X);
end;
TRichMemo(Owner).Invalidate;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: integer;
begin
{ Ruler := } TMyRulerForRichMemo.Create(RichMemo1);
// we don't need the Ruler variable anywhere
RichMemo1.Clear;
RichMemo1.Font.Name := 'Calibri';
RichMemo1.Font.Size := 11;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'aaaaaaaaaa' + RichMemo1.Lines.LineBreak;
RichMemo1.SelAttributes.Size := 11;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'bbbbbbbbbb' + RichMemo1.Lines.LineBreak;
RichMemo1.SelAttributes.Size := 16;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'cccccccccc' + RichMemo1.Lines.LineBreak;
RichMemo1.SelAttributes.Size := 20;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'ddd';
RichMemo1.SelAttributes.Size := 11;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'XXXX';
RichMemo1.SelAttributes.Size := 30;
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := 'dddd' + RichMemo1.Lines.LineBreak;
RichMemo1.SelAttributes.Size := 11;
for I := 6 to 26 do
begin
RichMemo1.SelStart := 9999999;
RichMemo1.SelText := StringOfChar(chr(64 + I), 10) + RichMemo1.Lines.LineBreak;
RichMemo1.SelAttributes.Size := 11;
end;
RichMemo1.SelStart := 0;
end;