форматирование текста в RichEdit

max_feel
Дата: 01.05.2011 22:46:54
Как пример есть вот такой текст в компоненте RichEdit:
<B>hello</B>
<I>hello.</I>
<U>подчеркнутый</U>

Пытаюсь отобразить текст как в браузере, пока только с простыми тегами форматирования текста.
Для этого набросал вот такой код, который должен отформатировать текст RichEdit'a для каждого тега:
procedure TForm1.HTMLText;
var
  i: Integer;
  s: string;
  IsTagBegin: boolean;
  IsTagEnd: boolean;
  tag: string;
  textStart, textEnd: integer;
  tagProcessed: boolean;
  count: integer;
begin
    s := RichEdit1.Lines.Text;
    isTagBegin := False;
    IsTagEnd := False;
    tag := '';
    textStart := 0;
    textEnd := 0;
    tagProcessed := False;
    count := 0;

    for i := 1 to Length(s) do
    begin
      if (s[i] = '<') and (s[i+1] <> '/') then
      begin
        isTagBegin := True;
        isTagEnd := False;
        tagProcessed := True;
        continue;
      end
      else
        if (s[i] = '<') and (s[i+1] = '/') then
        begin
          textEnd := count;
          isTagBegin := False;
          isTagEnd := True;
          continue;
        end;
      if isTagBegin and (s[i] <> '>') then
        tag := tag + s[i]
      else
        if s[i] = '>' then
        begin
          if isTagBegin then
          begin
            textStart := i;
            count := 0;
          end;
          isTagBegin := False;
          isTagEnd := False;
          continue;
        end;
      if not isTagBegin and not IsTagEnd then
        count := count + 1;
      if not isTagBegin and isTagEnd and tagProcessed then
      begin
        cxRichEdit1.SetSelection(textStart, textEnd);
        if '<' + tag + '>' = '<B>' then
          cxRichEdit1.SelAttributes.Style := [fsBold]
        else
          if '<' + tag + '>' = '<I>' then
            cxRichEdit1.SelAttributes.Style := [fsItalic]
          else
            if '<' + tag + '>' = '<U>' then
              cxRichEdit1.SelAttributes.Style := [fsUnderline];
        textStart := 0;
        textEnd := 0;
        tag := '';
        tagProcessed := False;
        count := 0;
      end;
    end;
end;

Получаю результат не тот что надо. Оно почему-то в каждой новой строчке делает сдвиг по символам в каждой строке + 1 символ кроме первой. Вот результат:
Garfish
Дата: 01.05.2011 22:55:19
max_feel, как то так

          RichEdit1.SelStart //устанавливаем курсор в начало вхождения искомой строки
          RichEdit1.SelLength //Выделяем стороку длинной
          RichEdit1.SelAttributes.Style ;//стиль шрифта
          RichEdit1.SelAttributes.Color ;//цвет шрифта
Sharkfire
Дата: 01.05.2011 22:59:37
Вам лучше бы "исходник" хранить отдельно а форматировать в RichEdit отдельно.
max_feel
Дата: 01.05.2011 23:03:34
Оно то выделяет вроде как бы правильно, если разложить саму строку RichEdit1.Lines.Text в массив и наложить на нее найденные позиции символов которые задаются в SelStart, то вроде как похоже на правду. Но почему то выделения в компоненте не правильные получаются. Вот тут выложил скрин http://loadingbox.net/6966
Может оно как-то зависит от служебных символов, которые нужно как-то обрабатывать дополнительно?
max_feel
Дата: 01.05.2011 23:31:42
вот тут на скриншоте я отобразил массив строки и найденные выделяемые индексы в ней: http://loadingbox.net/6970
Garfish
Дата: 01.05.2011 23:37:04
max_feel,

может не учитывается символы перехода на новую строку \r\n
max_feel
Дата: 01.05.2011 23:46:54
тоже была такая идея. Вероятнее всего в RichEdit'e они не учитываются, попробую их тоже игнорить при поиске
max_feel
Дата: 01.05.2011 23:56:52
В общем заработал. Оказалось что нужно не учитывать символ #13 (переход на новую строку).
Но символ #10 оказалось, что надо учитывать. Тема закрыта, всем большое спасибо