Я после дня игры в X-COM стал думать как мне поменьше ходов потратить, идя по комнате, чтобы потом хватило дверь открыть!
В версии 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 <> nilthen
Converter := FConverter
else
Converter := RichEdit.DefaultConverter.Create;
StreamInfo.Converter := Converter;
trywith EditStream dobegin
dwCookie := LongInt(Pointer(@StreamInfo));
pfnCallBack := @StreamLoad;
dwError := 0;
end;
Position := Stream.Position;
if PlainText then
TextType := SF_TEXT
else
TextType := SF_RTF;
SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
if (TextType = SF_RTF) and (EditStream.dwError <> 0) thenbegin
Stream.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 = nilthen
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 <> nilthen
Converter := FConverter
else
Converter := RichEdit.DefaultConverter.Create;
StreamInfo.Converter := Converter;
trywith EditStream dobegin
dwCookie := LongInt(Pointer(@StreamInfo));
pfnCallBack := @StreamLoad;
dwError := 0;
end;
Position := Stream.Position;
if PlainText then
TextType := SF_TEXT
else
TextType := SF_RTF;
SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
if (TextType = SF_RTF) and (EditStream.dwError <> 0) thenbegin
Stream.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 = nilthen
Converter.Free;
end;
end;
Статья обсуждает проблему загрузки текста формата RTF (Rich Text Format) в компонент TRichEdit в Borland Delphi 3 Client/Server с помощью метода LoadFromStream. Автор, Сергей Лагонский, обнаружил причину проблемы и предоставляет исправленный код.
Оригинальный код содержит ошибку в обработке загрузки текста RTF. Специально, строка if PlainText then TextType := SF_RTF else TextType := SF_TEXT; неправильна, потому что она устанавливает TextType в SF_RTF, когда загружается простой текст, и наоборот.
Исправленный код исправляет этоissue, правильно устанавливающий TextType на основе переменной PlainText:
Это изменение обеспечивает корректную загрузку текста RTF, без интерпретации простого текста как RTF и наоборот.
sworth noting, что код также использует блок try-finally для обеспечения того, что объект Converter будет освобожден, когда он больше не нужен. Это хорошая практика для предотвращения утечек памяти.
В целом, исправленный код предоставляет надежный способ загрузки текста RTF в компонент TRichEdit в Delphi 3 Client/Server.
Исправление загрузки RTF-текста через поток в компоненте TRichEdit Delphi, вызванное неправильным использованием переменной TextType.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.