Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2022, 13:01   #1
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
Вопрос RichEdit и выгрузка в RTF-файл

Здравствуйте. Имеется RichEdit, в котором ведётся лог в уже отформатированном виде. У RichEdit'а есть свойство PlainText. Если оно стоит False, то RichEdit передаёт в файл не только голый текст, но и мета-данные. И можно уже не разбираться в особенностях тегирования RTF'а, а выгружать в файл уже отформатированный текст.
У RichEdit'а есть SaveToFile. Сохраняет в файл текст вместе со всем редактированием текста (цвет, шрифт, жирность/курсивность и т.д.). Но минус SaveToFile в том, что он всегда перезатерает файл.
Необходимо файл не перезатерать, а дополнять текстом.
Также как альтернатива есть SaveToStream.
Думал, что можно через него дозаписывать файл:
Код:
procedure asdasd;
var RTFfile: TFileStream;
begin
  RTFfile := TFileStream.Create('File.rtf', fmOpenWrite); //Открываем для записи в файл
  try
    RTFfile.Seek(0, soEnd); //Проматываем файл в конец
    RichEditLog.Lines.SaveToStream(RTFfile);
  finally
    RTFfile.Free;
  end
end;
Всё равно файл перезатерается, хотя в параметре Seek указал soEnd.
Залез в код SaveToStream, посмотреть как он работает, но ничего не понял.

Не подскажите как из RichEdit'a дозаписывать текст в имеющийся RTF-файл с форматированием в соответствии с тем, что было в RichEdit?

Delphi XE2.

Последний раз редактировалось Explosion; 14.02.2022 в 13:05.
Explosion вне форума Ответить с цитированием
Старый 14.02.2022, 13:39   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Как идея: загрузить во второй ричедит существующий файл, дальше добавить в конец содержимое первого ричедита, и уже второй ричедит сохранить в файл с помощью SaveToFile. Чтобы эти манипуляции скрыть от пользователя, второй ричедит можно сделать невидимым.
Arigato вне форума Ответить с цитированием
Старый 14.02.2022, 14:17   #3
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Как идея: загрузить во второй ричедит существующий файл, дальше добавить в конец содержимое первого ричедита, и уже второй ричедит сохранить в файл с помощью SaveToFile. Чтобы эти манипуляции скрыть от пользователя, второй ричедит можно сделать невидимым.
Довольно ресурсно-затратно. Логи идут примерно раз в 15 секунд, за день файл накапливает довольно много текста. Проще тогда обычный txt делать. Может ещё идеи будут?
Explosion вне форума Ответить с цитированием
Старый 14.02.2022, 14:43   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Сгенерировал 4 разноцветные строки, вот что записалось в файл:
Код:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 Tahoma;}}
{\colortbl ;\red128\green128\blue128;\red255\green0\blue0;\red0\green128\blue0;}
\viewkind4\uc1\pard\cf1\f0\fs16 AEPVDOUIIP\par
\cf2 AGBKXHU\par
\cf1 DAHKEROKJO\par
\cf3 AH\par
\cf0\par
}
В конце еще нулевой байт. Так что просто так склеить два файла не получится. Предлагаю все же рассмотреть идею с загрузкой имеющегося файла и добавлением в конец него нужных данных. Ну или перейти на простой текст, там несложно дописать в конец файла не перезаписывая весь файл.

Сами данные в формате RTF можно получить с помощью такой функции (взято на просторах интернета):
Код:
function RichTextToStr(red : TRichEdit) : string;

var   ss : TStringStream;

begin
  ss := TStringStream.Create('');

  try
    red.Lines.SaveToStream(ss);
    Result := ss.DataString;
  finally
    ss.Free;
  end;
end;
В принципе можно загрузить имеющийся файл целиком, затем получить данные из текущего ричедита, далее добавить эти данные в конец загруженных, удалив в конце нулевой байт и закрывающуюся скобку }, а так же удалив в начале открывающуюся скобку {, то есть вручную поправив текст. Ну и все это сохранить в файл целиком.

Решение несколько криво выглядит, но другого я не вижу.

Последний раз редактировалось Arigato; 14.02.2022 в 14:49.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Извлечь выделенный текст в rtf формате RichEdit. Delphi7 Fotal Общие вопросы Delphi 9 06.12.2020 03:30
RichEdit: Загрузка из rtf-файла только текста Oleg060783 Помощь студентам 16 25.06.2015 09:15
Можно ли вывести rtf в RichEdit из бд access belkeandrey БД в Delphi 13 08.05.2013 12:31
RTF содержимое ячейки таблицы MS Word в Буфер обмена или в RichEdit OlegVE Microsoft Office Word 4 25.11.2010 12:54
При открытие в OpenDialog .doc-вский файл должен отображаться в RichEdit. doc to rtf Lemon Компоненты Delphi 9 07.06.2007 19:19