Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

RichEdit: Синхронизация и ограничения.   Найти похожие ветки 

 
Artlav ©   (2008-06-15 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= ©   (2008-06-16 11:50) [1]

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


 
Artlav ©   (2008-06-16 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= ©   (2008-06-17 17:53) [3]

Ну, я имел в виду, что отрисосывается всё, или только то, что видно. Но теперь-то ясно...

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


 
Artlav ©   (2008-06-17 19:21) [4]


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

Memo=EditBox? Если да, то как же в нём делать подсветку?
И если нет и если да, можно поподробнее?


 
=BuckLr= ©   (2008-06-18 11:16) [5]

Да, эдитбокс. Подсветка есть в компоненте Кладова, поищи. Очень хороший компонент



Страницы: 1 вся ветка

Текущий архив: 2010.03.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
15-1261416148
@!!ex
2009-12-21 20:22
2010.03.07
Продажа доступа к данным. Как лучше?


2-1262180202
RWolf
2009-12-30 16:36
2010.03.07
DBGrid + скролл


2-1262780530
Иван
2010-01-06 15:22
2010.03.07
Выделение слов в RichEdit на лету


2-1262118378
Pavel
2009-12-29 23:26
2010.03.07
Ошибка при вызове GetInetFile


11-1213003972
Kent
2008-06-09 13:32
2010.03.07
Как сохранить данные в dfm