Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Gutter как в Delphi


Автор: CHERRY 8.3.2010, 15:05
Как организовать нумерцию строк в RichEdit?
Типа как в редакторе Delphi?

Автор: Proxin 8.3.2010, 15:52
используйте synedit.

Автор: CHERRY 8.3.2010, 21:32
Цитата(Proxin @ 8.3.2010,  12:52)
используйте synedit.

Нет, хотелось бы самому.
Нарисовать Gutter не проблема. Номер строки написать тоже не проблема.
Как совместить TextOut(х,y,номер строки) с самой строкой в RichEdit.
И чтобы вместе двигались при скроллинге.?

Автор: CHERRY 9.3.2010, 17:22
Вопрос нумерации строк в RichEdit я решил следующим образом.
Может быть не очень красиво, но работает неплохо.
Ф-ции GetFirstVisibleLine и GetLastVisibleLine описаны в DRKB как
function RE_GetLastVisibleLine(RichEdit: TRichEdit): Integer;
function RE_GetFirstVisibleLine(RichEdit: TRichEdit): Integer;
Код

{Рисуем Gutter}
procedure TChREdit.DrawGutter;
var
  MCanvas: TControlCanvas;
  nLine:String;
  lPt: TPoint;
  lPos,i: Integer;
Begin
  //Рисуем Gutter
  if FShowGutter then
  Begin
   MCanvas:=TControlCanvas.Create;
   Try
    MCanvas.Control:=Self;
    With MCanvas do
    Begin
     Brush.Color:=clBtnFace;
     Pen.Color:=clBlack;
     Rectangle(0, 0, FGutterWidth, Height);
     Font.Color:=clBlack;
     Font.Style:=[];
     Font.Name:='Courier New';
     Font.Size:=Self.Font.Size;
     Font.Pitch:=fpFixed;//для упрощения форматирования
     for I := GetFirstVisibleLine to GetLastVisibleLine do
      Begin
        //получаем номер символа в начале [текущей (-1)] i-й строки.
        lPos := SendMessage( Self.Handle, EM_LINEINDEX, i, 0 );
        if lPos<> -1 then
        //получаем координаты Left/Top символа с номером lPos
        SendMessage(Self.Handle, EM_POSFROMCHAR, Integer(@lPt), lPos );
        if i<10 then nLine:='  '+IntToStr(i)
        Else if (i>=10)and(i<100) then nLine:=' '+IntToStr(i)
        Else nLine:=IntToStr(i);
        TextOut(1{X},lPt.y{Y},nLine{число});
      End;
    end;
   finally
    MCanvas.Free;
   End;
  End;
End;


procedure TChREdit.WMPaint(var Message: TWMPaint);
Begin
  inherited;
  DrawGutter;
end;



Добавлено через 2 минуты и 8 секунд
Всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)