Прежде всего, я перефразирую ваш вопрос, потому что в его текущем воплощении (нумерованный список) ответить нелегко. Я подумал на самом деле отредактировать ваш вопрос, но это могло бы быть слишком резким. Я делаю это только потому, что вы новичок на сайте. Если бы вы не были новичком, я бы просто добавил комментарий с вопросом «Что за вопрос?»
Я думаю, что вопрос должен был выглядеть так:
TRichEdit некорректно работает с каким-то конкретным RTF
Я генерирую некоторый RTF на основе данных из базы данных и загружаю их в элемент управления TRichEdit. Большую часть времени он работает нормально, но в нескольких случаях результирующий RTF вызывает неправильное поведение TRichEdit: он отлично отображает RTF, но при переходе к новой записи TRichEdit просто отказывается загружать новый текст! Он не выдает исключение, но с компьютера раздается звуковой сигнал.
Некоторые предыстории: текст, загружаемый в TRichEdit, имеет длину в тысячи строк, а не то, что можно легко прикрепить к этому сообщению. Этот RTF построен из меньших битов RTF, скопированных из Microsoft Outlook или Microsoft Word. Очевидно, ошибка возникает, когда /f0protect
(или что-то очень похожее на это) обнаруживается в битах RTF, полученных из Outlook или Word. Переход в базу данных и удаление этих разметок устраняет проблему, но мне нужно лучшее решение.
Я не уверен, в чем может быть проблема. Я думаю, что это один из:
- Возможно, проблема с кодами RTF.
- Буфер или память.
- TRichEdit control.
А теперь мой ответ:
Некоторые сведения о формате RTF. Прежде всего, это контролируемый Microsoft формат, который постоянно пересматривается. Вы можете в значительной степени сохранить любой документ Word в формате RTF, повторно загрузить его в Word и сделать так, чтобы он выглядел одинаково. Это не значит, что вы можете загрузить любой RTF-файл в WordPad, и он будет выглядеть точно так же, как в Word! Microsoft слишком умна, чтобы совершать такую детскую ошибку. WordPad - это просто оболочка для Microsoft Rich Text Controll (так же, как TRichEdit). Это означает, что есть ограничения на то, что может делать TRichEdit.
Во-вторых, формат RTF не является контекстно-свободным: вы не можете просто добавить два фрагмента RTF и получить действительный RTF! Документ RTF должен начинаться с заголовка, за которым следует область документа. Если вы добавите два фрагмента RTF, вы получите два заголовка, и я думаю, что результат не определен.
Вы, вероятно, правы, проблема одна из трех, которые вы упомянули. К счастью это легко проверить, бросить процесс исключения:
Буфер или память: насколько велик ваш конечный RTF? Создайте некоторый RTF равной длины (или больше) из кода, убедившись, что он содержит только простой RTF. Это плохо ведет себя? Если это так, вы столкнулись с каким-то ограничением памяти, но я сомневаюсь в этом. Тем не менее, это легко проверить!
Проблема может быть с кодами RTF: очень вероятно! Вы говорите, что проблема исчезнет, если вы удалите эти оскорбительные теги из базы данных; Удалите теги из кода в процессе построения большого RTF. Если у вас получится длинный список тегов, которые нужно удалить, возможно, вам нужно сделать это наоборот: составьте список кодов, которые вы хотите сохранить, и удалите все остальное!
Элемент управления TRichEdit: Насколько мне известно, стороннего редактора форматированного текста не существует, поэтому вы можете также рассматривать проблему (3) так же, как проблему (1). Сказать «Этот RTF действителен, потому что он отлично работает в Microsoft Word 2010», не поможет ни капли, если только вы не хотите показать свой RTF в окне Word с помощью OLE Automation!
Другие предложения:
- Покажите некоторый код о том, как вы на самом деле строите большой RTF.
- Если вы нашли неправильный тег RTF и вам нужна дополнительная информация, скопируйте и вставьте точный код:
/f0protect
недопустим RTF!