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

Как сохранить форматированный текст из Word в TFDQuery и загрузить его обратно в RichEdit в Delphi

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

Сохранение и загрузка RTF текста из Word в TFDQuery с использованием Delphi

В этой статье мы рассмотрим, как сохранить форматированный текст (RTF - Rich Text Format) из редактора Word в поле nvarchar(max) таблицы MSSQL через компонент TFDQuery в Delphi, а затем загрузить его обратно в компонент TRichEdit.

Проблема:

Необходимо обеспечить возможность копирования текста из Word в TRichEdit, сохранения этого текста (в формате RTF) в базе данных MSSQL и последующей загрузки сохраненного текста обратно в TRichEdit для отображения.

Решение:

Предлагается несколько подходов к решению данной задачи, каждый из которых имеет свои преимущества и недостатки.

1. Использование текстового поля (nvarchar/varchar) для хранения RTF:

  • Описание: RTF - это текстовый формат, поэтому можно хранить его непосредственно в текстовом поле базы данных.
  • Преимущества: Простота реализации, отсутствие необходимости работы с BLOB полями.
  • Недостатки: Необходимо корректно экранировать специальные символы, чтобы избежать ошибок при формировании SQL запросов. Возможны проблемы с кодировкой, если используется varchar вместо nvarchar.

Пример кода (сохранение):

uses
  System.Classes, System.SysUtils, FireDAC.Comp.Client, FireDAC.Stan.Param;

procedure SaveRTFToDatabase(RichEdit: TRichEdit; Query: TFDQuery; FieldName: string);
var
  Stream: TStringStream;
  RTFText: string;
begin
  Stream := TStringStream.Create;
  try
    RichEdit.Lines.SaveToStream(Stream);
    RTFText := Stream.DataString;

    // Использование параметризованного запроса для избежания проблем с экранированием
    Query.SQL.Text := 'UPDATE YourTable SET ' + FieldName + ' = :RTFText WHERE ID = :YourID';
    Query.Params.ParamByName('RTFText').AsString := RTFText;
    Query.Params.ParamByName('YourID').AsInteger := YourIDValue; // Замените YourIDValue на реальное значение ID
    Query.ExecSQL;
  finally
    Stream.Free;
  end;
end;

Пример кода (загрузка):

uses
  System.Classes, System.SysUtils, FireDAC.Comp.Client, FireDAC.Stan.Param;

procedure LoadRTFFromDatabase(RichEdit: TRichEdit; Query: TFDQuery; FieldName: string);
var
  Stream: TStringStream;
  RTFText: string;
begin
  Query.SQL.Text := 'SELECT ' + FieldName + ' FROM YourTable WHERE ID = :YourID';
  Query.Params.ParamByName('YourID').AsInteger := YourIDValue; // Замените YourIDValue на реальное значение ID
  Query.Open;
  try
    if not Query.IsEmpty then
    begin
      RTFText := Query.FieldByName(FieldName).AsString;
      Stream := TStringStream.Create(RTFText);
      try
        RichEdit.Lines.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
  finally
    Query.Close;
  end;
end;

Важно: Используйте параметризованные запросы (TFDQuery.Params) для предотвращения SQL-инъекций и автоматического экранирования специальных символов.

2. Использование BLOB поля для хранения RTF:

  • Описание: Хранение RTF в бинарном поле (BLOB) базы данных.
  • Преимущества: Нет необходимости в экранировании символов, более надежный способ хранения бинарных данных.
  • Недостатки: Требует работы с потоками (streams) для записи и чтения данных.

Пример кода (сохранение):

uses
  System.Classes, System.SysUtils, FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.Stan.Intf;

procedure SaveRTFToBlob(RichEdit: TRichEdit; Query: TFDQuery; FieldName: string);
var
  BlobStream: TFDUpdateBlobStream;
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    RichEdit.Lines.SaveToStream(Stream);
    Stream.Position := 0;

    Query.SQL.Text := 'UPDATE YourTable SET ' + FieldName + ' = :BlobData WHERE ID = :YourID';
    Query.Params.ParamByName('YourID').AsInteger := YourIDValue; // Замените YourIDValue на реальное значение ID
    Query.Params.ParamByName('BlobData').DataType := ftBlob;
    Query.Params.ParamByName('BlobData').AsStream := Stream;
    Query.ExecSQL;
  finally
    Stream.Free;
  end;
end;

Пример кода (загрузка):

uses
  System.Classes, System.SysUtils, FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.Stan.Intf;

procedure LoadRTFFromBlob(RichEdit: TRichEdit; Query: TFDQuery; FieldName: string);
var
  BlobStream: TFDUpdateBlobStream;
  Stream: TMemoryStream;
begin
  Query.SQL.Text := 'SELECT ' + FieldName + ' FROM YourTable WHERE ID = :YourID';
  Query.Params.ParamByName('YourID').AsInteger := YourIDValue; // Замените YourIDValue на реальное значение ID
  Query.Open;
  try
    if not Query.IsEmpty then
    begin
      Stream := TMemoryStream.Create;
      try
        BlobStream := TFDUpdateBlobStream.Create(Query.FieldByName(FieldName), bmRead);
        try
          Stream.CopyFrom(BlobStream, 0);
          Stream.Position := 0;
          RichEdit.Lines.LoadFromStream(Stream);
        finally
          BlobStream.Free;
        end;
      finally
        Stream.Free;
      end;
    end;
  finally
    Query.Close;
  end;
end;

Альтернативное решение:

Использовать компонент TDBRichEdit. Этот компонент является data-aware и может напрямую связываться с BLOB полем в базе данных. В этом случае не нужно писать код для сохранения и загрузки данных, компонент сделает это автоматически при вызове методов TQuery.Edit, TQuery.Post и т.д. Однако, TDBRichEdit требует использования TQuery в режиме data-aware, т.е. когда TQuery связан с TDataSource и другими data-aware компонентами.

Рекомендации:

  • Используйте параметризованные запросы для безопасности и корректной обработки специальных символов.
  • Если размер RTF текста может быть большим, рекомендуется использовать BLOB поля для хранения.
  • Рассмотрите возможность использования TDBRichEdit для упрощения работы с RTF данными, если это соответствует архитектуре вашего приложения.
  • При использовании текстовых полей, выбирайте nvarchar(max) для поддержки Unicode символов.
  • Проверяйте кодировку RTF текста и убедитесь, что она соответствует кодировке базы данных.

Дополнительные замечания:

  • В Delphi 12 используется RichEdit 4.1.
  • RTF может содержать управляющие коды (например, #13, #10 после \par), но они не являются обязательными.
  • Для получения ID новой записи после вставки в MSSQL можно использовать OUTPUT INSERTED.ID в INSERT запросе.

Эта статья предоставляет несколько подходов к решению задачи сохранения и загрузки RTF текста из Word в TFDQuery и RichEdit. Выбор конкретного подхода зависит от ваших требований и предпочтений.

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

В контексте описывается, как сохранять и загружать RTF-текст из Word в базу данных MSSQL с использованием компонента TFDQuery в Delphi, а также отображать его в компоненте TRichEdit.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 17:14:06
2025-10-14 23:33:56/0.021971940994263/0