Delphi 7, TRichedit, Застрял в RTF-кодировании - PullRequest
1 голос
/ 23 декабря 2010

Я даю вам краткое представление об этой проблеме.

  1. Извлечение (id, name) записей полей из базы данных в список.
  2. Выберите любую запись из списка.
  3. Отображение примечаний (типа BLOB-объектов) в поле расширенного редактирования для выбранного идентификатора.
  4. За исключением двух записей все в порядке.
  5. Обе две записи содержат тысячи строк записей вбаза данных. Примечания: [Это происходит из примечаний, вставленных из слова или внешнего вида с определенными кодами форматирования RTF.То, что, по-видимому, вызывает «заметку», это то, где / f0protect (или что-то очень похожее на это) находится в кодировке.Все те, которые вызывают проблемы, имеют это где-то на страницах заметок.Решение состоит в том, чтобы открыть запись базовой таблицы, найти запись и отобразить поле примечаний.Вырежьте / удалите заметки из записи базовой таблицы и вставьте их в Word или Блокнот (в зависимости от объема).Сделайте много Find & Replace на кодировке RTF.И заново скопируйте заметки обратно в запись базовой таблицы.]

  6. Правильное отображение данных в расширенном редактировании.

  7. После этого записи приложению не удалось загрузить другие примечания в расширенное редактирование, выбрав другие записи изlist box.
  8. Внутренне выдает звуковой сигнал об ошибке.
  9. Не выдает ни ошибки, ни исключения.

У меня есть три мысли по поводу этой проблемы.1. Проблема может быть с кодами RTF.2. Буфер или память.3. Управление TRichEdit.

Надеюсь, это объяснение поможет мне.

Заранее спасибо за помощь.

1 Ответ

4 голосов
/ 24 декабря 2010

Прежде всего, я перефразирую ваш вопрос, потому что в его текущем воплощении (нумерованный список) ответить нелегко. Я подумал на самом деле отредактировать ваш вопрос, но это могло бы быть слишком резким. Я делаю это только потому, что вы новичок на сайте. Если бы вы не были новичком, я бы просто добавил комментарий с вопросом «Что за вопрос?»

Я думаю, что вопрос должен был выглядеть так:


TRichEdit некорректно работает с каким-то конкретным RTF

Я генерирую некоторый RTF на основе данных из базы данных и загружаю их в элемент управления TRichEdit. Большую часть времени он работает нормально, но в нескольких случаях результирующий RTF вызывает неправильное поведение TRichEdit: он отлично отображает RTF, но при переходе к новой записи TRichEdit просто отказывается загружать новый текст! Он не выдает исключение, но с компьютера раздается звуковой сигнал.

Некоторые предыстории: текст, загружаемый в TRichEdit, имеет длину в тысячи строк, а не то, что можно легко прикрепить к этому сообщению. Этот RTF построен из меньших битов RTF, скопированных из Microsoft Outlook или Microsoft Word. Очевидно, ошибка возникает, когда /f0protect (или что-то очень похожее на это) обнаруживается в битах RTF, полученных из Outlook или Word. Переход в базу данных и удаление этих разметок устраняет проблему, но мне нужно лучшее решение.

Я не уверен, в чем может быть проблема. Я думаю, что это один из:

  1. Возможно, проблема с кодами RTF.
  2. Буфер или память.
  3. TRichEdit control.

А теперь мой ответ:

Некоторые сведения о формате RTF. Прежде всего, это контролируемый Microsoft формат, который постоянно пересматривается. Вы можете в значительной степени сохранить любой документ Word в формате RTF, повторно загрузить его в Word и сделать так, чтобы он выглядел одинаково. Это не значит, что вы можете загрузить любой RTF-файл в WordPad, и он будет выглядеть точно так же, как в Word! Microsoft слишком умна, чтобы совершать такую ​​детскую ошибку. WordPad - это просто оболочка для Microsoft Rich Text Controll (так же, как TRichEdit). Это означает, что есть ограничения на то, что может делать TRichEdit.

Во-вторых, формат RTF не является контекстно-свободным: вы не можете просто добавить два фрагмента RTF и получить действительный RTF! Документ RTF должен начинаться с заголовка, за которым следует область документа. Если вы добавите два фрагмента RTF, вы получите два заголовка, и я думаю, что результат не определен.

Вы, вероятно, правы, проблема одна из трех, которые вы упомянули. К счастью это легко проверить, бросить процесс исключения:

  1. Буфер или память: насколько велик ваш конечный RTF? Создайте некоторый RTF равной длины (или больше) из кода, убедившись, что он содержит только простой RTF. Это плохо ведет себя? Если это так, вы столкнулись с каким-то ограничением памяти, но я сомневаюсь в этом. Тем не менее, это легко проверить!

  2. Проблема может быть с кодами RTF: очень вероятно! Вы говорите, что проблема исчезнет, ​​если вы удалите эти оскорбительные теги из базы данных; Удалите теги из кода в процессе построения большого RTF. Если у вас получится длинный список тегов, которые нужно удалить, возможно, вам нужно сделать это наоборот: составьте список кодов, которые вы хотите сохранить, и удалите все остальное!

  3. Элемент управления TRichEdit: Насколько мне известно, стороннего редактора форматированного текста не существует, поэтому вы можете также рассматривать проблему (3) так же, как проблему (1). Сказать «Этот RTF действителен, потому что он отлично работает в Microsoft Word 2010», не поможет ни капли, если только вы не хотите показать свой RTF в окне Word с помощью OLE Automation!

Другие предложения:

  • Покажите некоторый код о том, как вы на самом деле строите большой RTF.
  • Если вы нашли неправильный тег RTF и вам нужна дополнительная информация, скопируйте и вставьте точный код: /f0protect недопустим RTF!
...