-
Artlav (03.12.07 21:57) [0]Пытаюсь сделать подсветку синтаксиса внутри richedit поля, проблемы две:
Как определить, что было изменение какого-то конкретного участка?
И самое главное - как запретить перерисовку в процессе форматирования?
Т.е. процедура вродеprocedure replkw(var editscr:PControl;w:string;i:integer;cl:tcolor);
var p:integer;
begin
p:=0;
p:=PosEx(w,editscr.Items[i],p);
while p<>0 do begin
editscr.SelStart:=editscr.item2Pos(i)+p-1;
editscr.SelLength:=length(w);
editscr.RE_FmtFontColor:=cl;
p:=PosEx(w,editscr.Items[i],p+1);
end;
end;
Делает своё дело, а в это время на экране скачет курсор и возникает/исчезает выделение. -
Дмитрий К © (03.12.07 23:14) [1]
> как запретить перерисовку в процессе форматирования?editscr.BeginUpdate;
//процесс форматирования
editscr.EndUpdate; -
Artlav (04.12.07 00:28) [2]Не помогло...
Точнее, курсор и выделение скакать перестали, но теперь при копи-пасте или удалении большого куска (перепроссчёт всего содержимого) скачет экран, а иногда и при простом и при полном просто смазывает всё - http://orbides.1gb.ru/orbf/thebug.jpg
Судя по всему я где-то делаю глупую ошибку.
procedure procsynt(var editscr:PControl);
var i,n:integer;
ss,sl:integer;
begin
editscr.BeginUpdate;
ss:=editscr.SelStart;
sl:=editscr.SelLength;
editscr.SelStart:=0;
editscr.SelLength:=99999999;
editscr.RE_FmtFontColor:=clblack;
n:=editscr.Pos2item(editscr.TextSize);
for i:=0 to n-1 do if length(editscr.Items[i])<>0 then procline(editscr,i);
editscr.SelStart:=ss;
editscr.SelLength:=sl;
editscr.EndUpdate;
end; -
Artlav (09.12.07 19:36) [3]Никто ничего не знает или это не возможно/я не там/не так спрашиваю?
-
PassedBy (11.12.07 01:12) [4]Может LockWindowUpdate попробовать?
-
PassedBy (11.12.07 01:13) [5]Кста.. Дай исходничек - поковыряю на досуге...