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