Советы по Delphi

       

Исправление загрузки RTF текста через поток


Пришло мне письмо от читателя . Вот что он пишет:

В версии Borland Delphi 3 Client/Server я обнаружил, что при загрузке текста формата RTF методом "LoadFromStream" в компонент TRichEdit он не интерпретируется как RTF, а отображается полностью (со всеми управляющими символами). Разбираясь в исходном тексте модуля COMCTRLS.PAS (дата создания: 4 августа 1997 года, размер: 391728 байт) я нашел причину, из-за которой вышеуказанный метод не работал как надо. Ниже я привожу исходный и исправленный тексты реализации метода "TRichEditStrings.LoadFromStream" (измененные строки отмечены символом "!"):

1. Исходный текст

procedure TRichEditStrings.LoadFromStream(Stream: TStream);
var
EditStream: TEditStream;Position: Longint;TextType: Longint;StreamInfo: TRichEditStreamInfo;Converter: TConversion;begin
StreamInfo.Stream := Stream;if FConverter <> nil thenConverter := FConverter elseConverter := RichEdit.DefaultConverter.Create;StreamInfo.Converter := Converter;trywith EditStream dobegindwCookie := LongInt(Pointer(@StreamInfo));pfnCallBack := @StreamLoad;dwError := 0;end;Position := Stream.Position;if PlainText then TextType := SF_TEXTelse TextType := SF_RTF;SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));if (TextType = SF_RTF) and (EditStream.dwError <> 0) thenbeginStream.Position := Position;! if PlainText then TextType := SF_RTF
! else TextType := SF_TEXT;

SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));if EditStream.dwError <> 0 thenraise EOutOfResources.Create(sRichEditLoadFail);end;finallyif FConverter = nil then Converter.Free;end;end;

2. Текст с исправлением:

procedure TRichEditStrings.LoadFromStream(Stream: TStream);
var
EditStream: TEditStream;Position: Longint;TextType: Longint;StreamInfo: TRichEditStreamInfo;Converter: TConversion;begin
StreamInfo.Stream := Stream;if FConverter <> nil thenConverter := FConverter elseConverter := RichEdit.DefaultConverter.Create;StreamInfo.Converter := Converter;trywith EditStream dobegindwCookie := LongInt(Pointer(@StreamInfo));pfnCallBack := @StreamLoad;dwError := 0;end;Position := Stream.Position;if PlainText then TextType := SF_TEXTelse TextType := SF_RTF;SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));if (TextType = SF_RTF) and (EditStream.dwError <> 0) thenbeginStream.Position := Position;! if PlainText then TextType := SF_TEXT
! else TextType := SF_RTF;

SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));if EditStream.dwError <> 0 thenraise EOutOfResources.Create(sRichEditLoadFail);end;finallyif FConverter = nil then Converter.Free;end;end;

С наилучшими пожеланиями

Сергей Лагонский.[000388]



Содержание раздела