![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ну вот, проблемы с RichEdit :)
TUser © (2004-07-26 11:36:00)Есть строки, котороые надо добавлять в РичЭдит и при этом форматировать. Строки выглядят примерно так
Italic textplain text underbold text ect
Если добавлять их методом Add - то все в порядке. Но надо добавлять их не разделяя на отдельные строки (ну там - первая строка, допустим 5 символов, потом добавляется еще 10 в эту же строку и т.д.)
Проблема в том, что, если написать, например
Strings[0]:=Strings[0]+anystring
или
Text:=copy(Text,1,length(Text)-2)+anytext
то все сделанное ранее ворматирование пропадает. Я сейчас сделал себе переменную, куда записываю исходные строки (с тегами) и пр добавлении каждой новой строки вписываю туда ее, а потом полностью заменяю Text. Но это - через Ж, и не на всех машинах работает. Как бы такую проблему решиь, желательно без использования стронних компонентов.
TUser (2004-07-26 12:43:00) [1]Ой, SelStart/SetAttributes, это я понятно, делаю. Но при изменении последней строки форматирование прежних строк пропадает. Приходится делать вот так, но это как-то неправильно.
procedure TScanerWindow.RichAdd(R:TRichEdit; var S:string; AsString:boolean);
var i,k,m:integer;
j:array of record
s,e:integer;
st:TFontStyle;
end;
ww:boolean;
s1:string;
procedure InputAC;
var m,n,k:integer;
ac:string;
begin
m:=pos('<ac>',S);
n:=posex('</ac>',S,m);
if (m <> 0) and (n<>0) then
repeat
ac:=copy(S,m+4,n-m-4);
s:=copy(S,1,m-1)+GetAC(ac)+copy(S,n+5,length(S)-n-4);
n:=n-4-(length(ac)-4);
m:=posex('<ac>',S,n);
n:=posex('</ac>',S,m);
until (m = 0) or (n = 0);
end;
procedure Prepare(Symbol:char; Style:TFontStyle);
var m,n,k:integer;
begin
m:=pos('<'+Symbol+'>',S);
n:=posex('</'+Symbol+'>',S,m);
if (m <> 0) and (n<>0) then
repeat
k:=length(j);
setLength(j,k+1);
j[k].s:=m; j[k].e:=n; j[k].st:=Style;
Delete(S,m,3);
for k:=0 to length(j)-1 do begin
if j[k].s > m then
j[k].s:=j[k].s-3;
if j[k].e > m then
j[k].e:=j[k].e-3;
end;
n:=n-3;
Delete(S,n,4);
for k:=0 to length(j)-1 do begin
if j[k].s > n then
j[k].s:=j[k].s-4;
if j[k].e > n then
j[k].e:=j[k].e-4;
end;
m:=posex('<'+Symbol+'>',S,n);
n:=posex('</'+Symbol+'>',S,m);
until (m = 0) or (n = 0);
if Symbol in ['a'..'z'] then
Prepare(upcase(Symbol),Style);
end;
begin
SetLength(j,0);
with R do with Lines do begin
BeginUpdate;
ww:=R.WordWrap;
R.WordWrap:=false;
i:=length(Text);
if not (AsString or (Count = 0)) then begin
S:=FStrList+S;
FStrList:=S;
i:=0;
end else if R = RichEdit1 then FStrList:=S;
InputAC;
Prepare('b',fsBold);
Prepare('i',fsItalic);
Prepare('u',fsUnderline);
if not (AsString or (Count = 0)) then
Text:=S
else Add(S);
for k:=0 to length(j)-1 do
for m:=j[k].s+i-1 to j[k].e+i-2 do begin
SelStart:=m;
SelLength:=1;
SelAttributes.Style:=SelAttributes.Style + [j[k].st];
end;
SelLength:=0;
SelStart:=length(Text);
R.WordWrap:=ww;
EndUpdate;
end;
end;
MU (2004-07-26 12:40:00) [2]SelText := '12345';
// после этого SelStart будет равен 5
SelText := 'XXXXXXXXXX';
MetalFan (2004-07-26 12:34:00) [3]
> Необязательно... :)
> первая строка, допустим 5 символов, потом добавляется еще
> 10 в эту же строку и т.д
?
SelStart := 5;
SelText :='0123456789';
MU (2004-07-26 12:07:00) [4]>>MetalFan ©
Необязательно... :)
MetalFan (2004-07-26 12:02:00) [5]
> MU © (26.07.04 11:50) [2]
+
SelStart
SelLength
)))
ПсихЪ_задумчивый (2004-07-26 11:54:00) [6]Без использования сторонних компонентов только ручками... (:
MU (2004-07-26 11:50:00) [7]RichEdit1.SelAttributes.Style := [fsItalic];
RichEdit1.SelText := 'Hello';
RichEdit1.SelAttributes.Style := [fsItalic, fsBold];
RichEdit1.SelText := 'Bye';
TUser (2004-07-26 11:40:00) [8]Опс. Это я теги написал. Имелось в виду вот так
<i'>Italic text</i'>plain text<u'><b'>underbold text</b'><u'> ect
Если добавлять их методом Add - то все в порядке. Но надо добавлять их не разделяя на отдельные строки (ну там - первая строка, допустим 5 символов, потом добавляется еще 10 в эту же строку и т.д.)
Проблема в том, что, если написать, например
Strings[0]:=Strings[0]+anystring
или
Text:=copy(Text,1,length(Text)-2)+anytext
то все сделанное ранее ворматирование пропадает. Я сейчас сделал себе переменную, куда записываю исходные строки (с тегами) и пр добавлении каждой новой строки вписываю туда ее, а потом полностью заменяю Text. Но это - через Ж, и не на всех машинах работает. Как бы такую проблему решиь, желательно без использования стронних компонентов.