voidHighLighter::HighLight(TRichEdit *r){ Scan(r); Ansi &s = r->Text; Ansi result = "{\\rtf1 "; result += ColorTable; ash = find.begin();// for(inti = 1;i <= s.Length();i++) { if(!ash->first || i < ash->first) {if(s[i] == '\n')result += "\\par ";elseresult += s[i]; } else if(i == ash->first){ result += ash->second->style->opentags; if(s[i] == '\n')result += "\\par ";elseresult += s[i]; }else if((i > ash->first) && (i < (ash->first + ash->second->size))){ result += s[i]; }else if(i == (ash->first + ash->second->size)){ result += ash->second->style->closetags; if(s[i] == '\n')result += "\\par ";elseresult += s[i]; ++ash; } } result += "\\par }"; //эти блоки предназначены для устранения //мерцания экрана r->DoubleBuffered = 1; int eventMask = (int)::SendMessage(r->Handle,EM_SETEVENTMASK,0,0); ::SendMessage(r->Handle,WM_SETREDRAW,false,0); CHARRANGE chrgSave; ::SendMessage(r->Handle,EM_EXGETSEL,0,(LPARAM)&chrgSave); int en = SendMessage(r->Handle,EM_GETFIRSTVISIBLELINE,0,0); r->Text = result;//меняем текст в RichEdit ::SendMessage(r->Handle,EM_EXSETSEL,0,(LPARAM)&chrgSave); int st = SendMessage(r->Handle,EM_GETFIRSTVISIBLELINE,0,0); if (st != en) SendMessage(r->Handle,EM_LINESCROLL,0,en-st); ::SendMessage(r->Handle, WM_SETREDRAW,true,0); ::InvalidateRect(r->Handle,0,true); ::SendMessage(r->Handle,EM_SETEVENTMASK,0,eventMask); r->DoubleBuffered = 0; r->Repaint(); }