Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Ну вот, проблемы с 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
4-1088443568
Vasya.ru
2004-06-28 21:26
2004.08.08
Как программно перезагрузить Windows?


3-1089710228
Джон
2004-07-13 13:17
2004.08.08
INSERT записи из текстового файла


4-1088146499
_student
2004-06-25 10:54
2004.08.08
Как можно сделать индикатор, ну например как в винампе


4-1087531479
Denizzz
2004-06-18 08:04
2004.08.08
Поверх DOS-окна


3-1089693882
Flagman
2004-07-13 08:44
2004.08.08
Есть ли что-нибудь аналогичгое MSSQL SQL profiler под Oracle?