Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибок отображения RTF в TRichEdit после миграции с Delphi 7 на Delphi 2010

Delphi , Компоненты и Классы , TMemo и TRichEdit

В процессе миграции программного обеспечения с Delphi 7 на Delphi 2010 разработчики часто сталкиваются с различными незначительными препятствиями. Одной из таких проблем является изменение поведения компонента TRichEdit, который ранее корректно отображал RTF-текст, полученный из BLOB-поля в базе данных MSSQL. В Delphi 7 код для отображения RTF-текста в TRichEdit выглядел следующим образом:

rtfStream := sql.CreateBlobStream(sql.FieldByName('rtftext'), BmRead) as TMemoryStream;
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(rtfStream);

Этот код работал исправно, но после обновления до Delphi 2010 RTF-текст начал отображаться как обычный текст с табуляциями между символами. Предполагается, что проблема связана с переходом от ANSI к Unicode, однако исправить её самостоятельно не удалось.

Решение проблемы

Для корректного отображения RTF-текста в TRichEdit после миграции на Delphi 2010, необходимо изменить подход к загрузке данных из базы данных. Вот шаги, которые помогут решить проблему:

  1. Получение RTF-текста из базы данных в виде AnsiString:
rtfString := sql.FieldByName('rtftext').AsAnsiString;
  1. Запись строки в поток:
stream := TMemoryStream.Create;
stream.Clear;
stream.Write(PAnsiChar(rtfString)^, Length(rtfString));
stream.Position := 0;
  1. Загрузка потока в TRichEdit:
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(stream);

Не забудьте освободить поток после использования:

stream.Free;

Сохранение RTF-текста

Для сохранения RTF-текста из TRichEdit обратно в базу данных, выполните следующие шаги:

  1. Сохранение текста из TRichEdit в поток:
stream := TMemoryStream.Create;
stream.Clear;
RichEdit.Lines.SaveToStream(stream);
stream.Position := 0;
  1. Чтение данных из потока в AnsiString:
if (stream.Size > 0) then begin
    SetLength(rtfString, stream.Size);
    if (stream.Read(rtfString[1], stream.Size) <= 0) then
        raise EStreamError.CreateFmt('End of stream reached with %d bytes left to read.', [stream.Size]);
end;
  1. Сохранение AnsiString в BLOB-поля базы данных:
sql.FieldByName('rtftext').AsAnsiString := rtfString;

Не забудьте освободить поток после операции чтения:

stream.Free;

Заключение

Использование AnsiString для загрузки и сохранения RTF-текста в TRichEdit после миграции на Delphi 2010 позволяет избежать проблем, связанных с переходом на Unicode. Эта проблема оказалась достаточно распространённой, и её решение может помочь многим разработчикам, столкнувшимся с аналогичной ситуацией.

Создано по материалам из источника по ссылке.

В процессе миграции программного обеспечения с Delphi 7 на Delphi 2010 возникла проблема отображения RTF-текста в компоненте `TRichEdit`, связанная с переходом от ANSI к Unicode.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TMemo и TRichEdit ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 08:59:28/0.0047481060028076/1