-
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 и многие другие кодоредакторы. -
А как подсветку делаешь, если не секрет? Как обычно, или что-то оригинальное придумал?
-
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;
По моему вопросу предложений нет? -
Ну, я имел в виду, что отрисосывается всё, или только то, что видно. Но теперь-то ясно...
По вопросу лично у меня предложений нет. Одно время хотел пользоваться RE для подсветки, но по ходу дела оказалось так много глюков, что я забил на него и взял Memo -
Artlav © (17.06.08 19:21) [4]
> По вопросу лично у меня предложений нет. Одно время хотел пользоваться RE для подсветки, но по ходу дела оказалось так много глюков, что я забил на него и взял Memo
Memo=EditBox? Если да, то как же в нём делать подсветку?
И если нет и если да, можно поподробнее? -
Да, эдитбокс. Подсветка есть в компоненте Кладова, поищи. Очень хороший компонент