Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизНу вот, проблемы с RichEdit :) Найти похожие ветки
← →
TUser © (2004-07-26 11:36) [0]Есть строки, котороые надо добавлять в РичЭдит и при этом форматировать. Строки выглядят примерно так
Italic textplain textunderbold text ect
Если добавлять их методом Add - то все в порядке. Но надо добавлять их не разделяя на отдельные строки (ну там - первая строка, допустим 5 символов, потом добавляется еще 10 в эту же строку и т.д.)
Проблема в том, что, если написать, например
Strings[0]:=Strings[0]+anystring
или
Text:=copy(Text,1,length(Text)-2)+anytext
то все сделанное ранее ворматирование пропадает. Я сейчас сделал себе переменную, куда записываю исходные строки (с тегами) и пр добавлении каждой новой строки вписываю туда ее, а потом полностью заменяю Text. Но это - через Ж, и не на всех машинах работает. Как бы такую проблему решиь, желательно без использования стронних компонентов.
← →
TUser © (2004-07-26 11:40) [1]Опс. Это я теги написал. Имелось в виду вот так
<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. Но это - через Ж, и не на всех машинах работает. Как бы такую проблему решиь, желательно без использования стронних компонентов.
← →
MU © (2004-07-26 11:50) [2]RichEdit1.SelAttributes.Style := [fsItalic];
RichEdit1.SelText := "Hello";
RichEdit1.SelAttributes.Style := [fsItalic, fsBold];
RichEdit1.SelText := "Bye";
← →
ПсихЪ_задумчивый (2004-07-26 11:54) [3]Без использования сторонних компонентов только ручками... (:
← →
MetalFan © (2004-07-26 12:02) [4]
> MU © (26.07.04 11:50) [2]
+
SelStart
SelLength
)))
← →
MU © (2004-07-26 12:07) [5]>>MetalFan ©
Необязательно... :)
← →
MetalFan © (2004-07-26 12:34) [6]
> Необязательно... :)
> первая строка, допустим 5 символов, потом добавляется еще
> 10 в эту же строку и т.д
?
SelStart := 5;
SelText :="0123456789";
← →
MU © (2004-07-26 12:40) [7]SelText := "12345";
// после этого SelStart будет равен 5
SelText := "XXXXXXXXXX";
← →
TUser © (2004-07-26 12:43) [8]Ой, 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.026 c