Внешний вид сайта:

Вставка RTF из одного TRichEdit в другой

Компонент TRichEdit является редактором, который поддерживает форматирование текста: текст, который включает в себя изменение атрибутов шрифта, форматирование абзацев, форматирование текста.

RTF это фактически ASCII файлы со специальными командами, которые указывают сведения о форматировании, например, шрифта, полей и т.д.

Компонент TRichEdit не предоставляет методов для добавления или вставки фрагмента текста RTF. У него есть свойство Lines, которое позволяет добавить дополнительный текст, но если Вы захотите добавить текст, который содержит форматирование, он будет добавлен как простой текст ASCII.

Если Вы хотите "переместить" весь текст из одного RichEdit в другой, Вы можете использовать потоки, но содержание одного RichEdit будет полностью переписано из RichEdit-источника.

Вот функция, которая позволяет добавлять или вставлять RTF текст из одного редактора в другой, используя определенные в RichEdit функции обратного вызова:

uses RichEdit;
 
procedure AppendToRichEdit(const source, 
  destination : TRichEdit) ;
var
  rtfStream: TEditStream;
  sourceStream : TMemoryStream;
 
function EditStreamReader(
  dwCookie: DWORD;
  pBuff: Pointer;
  cb: LongInt;
  pcb: PLongInt): DWORD; stdcall;
begin
   result := $0000;
   try
     pcb^ := TStream(dwCookie).Read(pBuff^, cb) ;
   except
     result := $FFFF;
   end;
 end; (*EditStreamReader*)
 begin
  destination.Lines.BeginUpdate;
  sourceStream := TMemoryStream.Create;
  try
    source.Lines.SaveToStream(sourceStream) ;
    sourceStream.Position := 0;
 
    destination.MaxLength := destination.MaxLength + 
        sourceStream.Size;
 
    rtfStream.dwCookie := DWORD(sourceStream) ;
    rtfStream.dwError := $0000;
    rtfStream.pfnCallback := @EditStreamReader;
    destination.Perform(
      EM_STREAMIN,
      SFF_SELECTION or SF_RTF or 
          SFF_PLAINRTF, LPARAM(@rtfStream)
    ) ;
    if rtfStream.dwError <> $0000 then
      raise Exception.Create('Ошибка вставки данных RTF.') ;
  finally
    sourceStream.Free;
    destination.Lines.EndUpdate;
  end;
end;

Процедура AppendToRichEdit получает два параметра. AppendToRichEdit копирует все содержимое "Источника" в RichEdit "Получатель".

В зависимости от выбора внутри RichEdit и положения курсора, процедура выше будет либо:

  • Заменять выделенный текст
  • Вставлять содержимое из источника в получатель в месте нахождения курсора
  • Добавлять содержимое из источника в получатель.

Комментарии

Нет комментариев. Ваш будет первым!