Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ну вот, проблемы с 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. Но это - через Ж, и не на всех машинах работает. Как бы такую проблему решиь, желательно без использования стронних компонентов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо