подсветка текста определенным образом в Richedit'e

vital

Больной Компом Детектед
29.01.2006
2 432
42
#1
вобсчем нуна разукрасить текст примерно в таком формате
текст [цвет$ текст] текст (почти как в форуме :) )

причем сообщение идет с сокета, но это уже мелочи..

Я пробовал делать примерно так
Код:
var
j:integer;
msg:string;
clr:tcolor;
...
msg:=socket.receivetext;
clr:=richedit.font.color;

for j:=0 to length(msg) -1 do
begin
if msg[j]='[' then
begin
richedit.selstart;
if copy(msg,j,pos('$',msg)='clred' then 
begin
richedit.selattributes.color:=clred;
end; 
end
else if msg[j]=']' then
begin
richedit.selattributes.color:=clr;
end;
end;
richedit.text:=richedit.text+msg[j];
писал сейчас руками поэтому возможны опечатки и небольшие несоответствия тому как делал в коде.
ЗЫ.
что-то мне подсказывает что запостил тему я не там..
 
B

Barmutik

Гость
#2
Я подсвечивал вот так:

Код:
RichEdit.Range(DocumentWords.higlight_absolute_positions[i] and $00FFFFFF,
DocumentWords.higlight_absolute_positions[i] and $00FFFFFF +
DocumentWords.higlight_absolute_positions[i] shr 24).Font.BackColor :=
HighlightBackgroundColor;
Указвается в рэйндже с какого по какой символ и потом меняется цвет фона...
 

vital

Больной Компом Детектед
29.01.2006
2 432
42
#3
хм..ложу на форму TRichEdit. Ставлю кнопку. В онклике кнопки вставляю из буфера вышенаписанный код.
И..
[Ошибка] Unit1.pas(29): Undeclared identifier: 'Range'
Такое ощущение, что мы о разных richedit'ах говорим..
 
B

Barmutik

Гость
#4
Ой .. извините у меня свой ричэдит в котором имплеменчены дополнительно интферфейсы.. IRichEditOLECallback, ITextLinks... они позволяют осуществлять доп операции с ричэдитом .. как то рэйнджи .. перехват линков и т.д...
 
Z

Zakus

Гость
#5
для стандартного РичЭдита, из 7ой дельфи...

RichEdit1: TRichEdit;

//выделяете текст который нужно "подсветить"
RichEdit1.SelStart := 2; //начало выделения
RichEdit1.SelLength := 3; //длинна выдиления

RichEdit1.SelAttributes.Color := clRed; //устанавливаете для выделенного текста цвет


всё...

можете покопаться в RichEdit1.SelAttributes, может кроме цвета что интересное для себя найдёте...

Для: vital
стоп, сейчас прочитал... и увидел что вы юзаете всё что я описал, так в чём вопрос??? ваш код не работает? или что?
 
Z

Zakus

Гость
#6
Для: vital
о как всё запущено...

ща код ваш розгребу... сделаю рабочим

но, вы вкурсе что у stringa первая буква не тут msg[0] а тут msg[1] =)))
 
Z

Zakus

Гость
#7
Код:
var
j:integer;
msg:string;
clr:tcolor;
begin

msg:= '[clBlue$ Test]';
clr:= clRed;

for j:=1 to length(msg) do
begin
if msg[j]='[' then
begin
if copy(msg,j+1,pos('$',msg)-2) ='clBlue' then
begin
clr := clBlue;
end;
end
else if msg[j]=']' then
begin


richedit1.text:=richedit1.text + copy(msg,pos('$',msg)+1, j- pos('$',msg) -1);


richedit1.SelStart := length(richedit1.text) -  length(copy(msg,pos('$',msg)+1, j- pos('$',msg) -1));
richedit1.SelLength := length(copy(msg,pos('$',msg)+1, j- pos('$',msg) -1));

richedit1.SelAttributes.Color := clr




end;
end;
что то такое) но правда всё равное не совсем хорошо работает
 

vital

Больной Компом Детектед
29.01.2006
2 432
42
#8
2zakus

строки бывают разные B)


2Barmutik

ну-ка поподробнее..

==================
недавно родилось вот это..

Код:
var 
msg,txt:string;
j,q:integer;
memo1:trichedit; //это у меня глюки такие.. 

msg:=socket.ReceiveText;
form5.memo1.Text:=form5.memo1.Text+#13#10;

for j:=1 to pos('[',msg)-1 do	//тут все понятно
begin
form5.memo1.Text:=form5.memo1.Text+msg[j];
end;

if copy(msg,pos('[',msg)+1,pos('$',msg)-pos('[',msg))='clred$' then {если текст скопированный начиная с символо после '[' до символа $ равен ='clred$'(ну почти так)}
begin
txt:=copy(msg,pos('$',msg)+1,pos(']',msg)-(pos('$',msg)+1)); //присваиваем переменной текст от $ до ]
form5.memo1.SelStart:=length(form5.memo1.text); // выделяем с последнего символа
form5.memo1.SelAttributes.Color:=clred; //делаем красный цвет
form5.memo1.SelText:=txt; //вставляем текст
end;

for q:=pos(']',msg)+1 to length(msg) do //тут тоже все понятно..
begin
form5.memo1.Text:=form5.memo1.Text+msg[q];
end;
 
B

Barmutik

Гость
#9
Для: vital

ЧТо конкретно поподробнее .. в Дельфийском РичЭдите не реализована половина возможностей микрософтовского РичЭдита...
 

vital

Больной Компом Детектед
29.01.2006
2 432
42
#10
2all

А как вставить RTF текст({rtf\ansi..) в RichEdit?
если
Код:
msg:='ртф взятый из другого ричэдита';

richedit1.plaintext:=false;
richedit1.text:=msg;
то вставляется всё..

2Barmutik
подробнее про имплементацию IRichEditOLECallback в RichEdit. Понятия про этот интерфейс не имею..Так как его добавить?