Вставка RTF из одного 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 и положения курсора, процедура выше будет либо:
- Заменять выделенный текст
- Вставлять содержимое из источника в получатель в месте нахождения курсора
- Добавлять содержимое из источника в получатель.
Комментарии