Конференция "KOL" » RichEdit: Синхронизация и ограничения. [Delphi, Windows]
 
  • Artlav © (15.06.08 15:53) [0]
    Пытаюсь сделать редактор кода на чистом KOL, основное поле редактора в виде RichEdit.

    Проблема первая:
    С боку у RichEdit поля есть панель, на которой написаны номера строк.
    Нужно эти номера синхронизовать с тем, что в редакторе.

    OnScroll реагирует только на ползунок, различные OnКнопки не дают полного покрытия, OnChange реагирует только на ввод.
    Пробовал OnPaint - работает, но исчезает всё.

    Как это сделать по-людски?

    Проблему в общем можно свести к вызову стандартных обработчиков событий из заменённых по типу "es.OnPaint:=TOnPaint(MakeMethod(frm,@espaint));".
    Т.е. то, что в VC++ делается по типу
    void CEditView::OnPaint(HDC dc)
    {
    CRichEditView::OnPaint(dc);  //<---
    UpdateNums();
    }




    Проблема вторая:
    Как ограничить прокрутку RichEdit поля по строкам, т.е. чтобы в поле не было дробных строк на верхней/нижней границе? Пример - редактор Delphi/Lazarus, MSVS и многие другие кодоредакторы.
  • =BuckLr= © (16.06.08 11:50) [1]
    А как подсветку делаешь, если не секрет? Как обычно, или что-то оригинальное придумал?
  • Artlav © (16.06.08 16:00) [2]

    > А как подсветку делаешь, если не секрет? Как обычно, или что-то оригинальное придумал?

    Зависит от определения "как обычно".

    Общий план подсветки таков, с вызовом первой при изменении и второй при загрузке (es - RichEdit):

    procedure procline(var es:PControl;i:integer);
    begin
    es.SelStart:=es.item2Pos(i)-1;
    es.SelLength:=es.item2Pos(i+1)-es.item2Pos(i);
    es.RE_FmtFontColor:=clblack;      
    es.RE_FmtBold:=false;    
    es.RE_FmtItalic:=false;

    replcoml(es,'//',i,clgreen);
    //...etc...;
    end;      
    //############################################################################//
    procedure procall(var es:PControl);
    var i,n:integer;
    pt:teditpositions;
    begin                    
    LockWindowUpdate(es.GetWindowHandle);  
    pt:=es.SavePosition;
    n:=es.Pos2item(es.TextSize);
    for i:=0 to n-1 do if length(es.Items[i])<>0 then procline(es,i);
    es.RestorePosition(pt);  
    LockWindowUpdate(0);  
    end;



    Непосредственно раскраска идёт по такому принципу (строковый комментарий):

    procedure replcoml(var es:PControl;w:string;i:integer;cl:tcolor);
    var p:integer;
    begin
    p:=PosEx(w,es.Items[i],p);
    while p<>0 do begin
     es.SelStart:=es.item2Pos(i)+p-1;
     es.SelLength:=es.item2Pos(i+1)-es.item2Pos(i)-p;
     es.RE_FmtFontColor:=cl;      
     es.RE_FmtItalic:=true;
     p:=PosEx(w,es.Items[i],p+1);
    end;
    end;



    По моему вопросу предложений нет?
  • =BuckLr= © (17.06.08 17:53) [3]
    Ну, я имел в виду, что отрисосывается всё, или только то, что видно. Но теперь-то ясно...

    По вопросу лично у меня предложений нет. Одно время хотел пользоваться RE для подсветки, но по ходу дела оказалось так много глюков, что я забил на него и взял Memo
  • Artlav © (17.06.08 19:21) [4]

    > По вопросу лично у меня предложений нет. Одно время хотел пользоваться RE для подсветки, но по ходу дела оказалось так много глюков, что я забил на него и взял Memo

    Memo=EditBox? Если да, то как же в нём делать подсветку?
    И если нет и если да, можно поподробнее?
  • =BuckLr= © (18.06.08 11:16) [5]
    Да, эдитбокс. Подсветка есть в компоненте Кладова, поищи. Очень хороший компонент
 
Конференция "KOL" » RichEdit: Синхронизация и ограничения. [Delphi, Windows]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]