Как отобразить отформатированный (цвет, стиль и т. Д.) Журнал в Delphi?

Мне нужно отобразить отформатированный журнал в Delphi 2009. Форматированию не нужно реализовывать все функции say html, но небольшая подмножество, например, цвет, стиль шрифта и т. Д.

В настоящее время я использую TRichEdit и собственные собственные теги, например, это синий. Это довольно запутанно, чтобы заставить это работать с TRichEdit, поскольку нет прямого доступа к RTF-тексту. Например, чтобы покрасить синий текст, я должен:

  1. Разберите добавленный текст, извлекая теги, выясняя, какой текст нужно отформатировать и как.
  2. Выберите текст.
  3. Примените форматирование.
  4. Отмените выбор текста и переместите выделение в конец текста, готового для следующего добавления.

Все это взломанно и медленно. Знаете ли вы, что лучше (быстрее) сделать это с помощью TRichEdit или другого элемента управления, который лучше подходит для работы?

Я должен упомянуть, что я рассмотрел использование HTML в TWebBrowser. Проблема с этим подходом заключается в том, что журнал может иметь длину от 1 до 100000 строк. Если я использую обычный просмотрщик html, мне нужно каждый раз устанавливать весь текст, а не просто добавлять его.

Кроме того, журнал должен обновляться в режиме реального времени, когда я добавляю строки к нему. Не просто читать из файла и отображаться один раз.

delphi,logging,delphi-2009,rtf,

5

Ответов: 6


9 принят

Простое решение: используйте TListBox с пользовательскими методами рисования и поместите записи журнала в TObjectList, используя объекты, которые содержат только основную информацию, а не форматирование (это будет применяться в коде презентации).

Или используйте компонент Virtual String List / VirtualTreeView . Будут отображены только те элементы, которые необходимо отобразить, это позволит сэкономить ресурсы.


4

Предполагая, что ваш журнал имеет длину 1 000 000 строк, вы можете забыть использовать HTML или RTF, самое чистое решение (и я обрабатываю 100-1 000 000) - использовать (как предполагает mjustin) TListBox с

Style := lbVirtualOwnerDraw;
OnDrawItem := ListDrawItem; // your own function (example in help file)
  1. Определите свой массив данных в любом формате, который будет полезен для остальной части приложения. Я иду с простым LogObject.
  2. Храните все объекты LogObjects в ObjectList, каждый раз, когда есть изменения в списке (добавьте, удалите), настройте TListBox.Count, чтобы соответствовать новому счету ObjectList.
  3. Определите ListDrawItem самостоятельно, чтобы взять индекс, и вы можете получить информацию от вас ObjectList (база данных, что угодно ..) и проанализировать по требованию.

Поскольку вы будете просматривать только несколько записей за раз, подход «по требованию» значительно лучше, поскольку при загрузке нет «замедления» при попытке проанализировать все миллионы строк.

Не зная вашей реальной проблемы, я могу просто сказать, что по моему опыту это метод, который когда-то был изучен и освоен, полезен в большинстве приложений, ориентированных на данные.

Усовершенствования включают атташе управления заголовком над полем списка (я обертываю их вместе на панели), и вы можете создать превосходный контроль TListView. Прикрепите бит логики сортировки к событию click в элементе управления заголовком, и вы можете отсортировать список объектов, и все, что вам нужно сделать, это вызвать ListBox.Invalidate, чтобы обновить представление (когда это возможно).

Ity all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all Я делаю это в данный момент, чтобы вызвать событие таймера, чтобы настроить ListBox.Count, так как вы не хотите обновлять список 1000 раз в секунду .. :-)


1

Возможно, вы захотите приобрести лексический сканер или компонентный блок синтаксиса для Delphi. Есть много доступных, и большинство из них не очень дорого. В вашем случае вы захотите проверить несколько и найти тот, который достаточно эффективен для ваших нужд.

Несколько примеров:

Для повышения эффективности выделения очень большого файла журнала просмотрите те, которые специализируются на выделение текстовых файлов. All all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all Но RichEdit действительно не сутулится.


1

если вы решите использовать TListbox, как было предложено, убедитесь, что вы разрешаете своим пользователям копировать данные о линии, которую они просматривают в буфер обмена. Нет ничего хуже, чем не копировать строки из журнала.


0

Полагаю, вы хотите показать существующий текстовый журнал, но примените к нему цвета?

Вот несколько вариантов, о которых я могу думать:

  • Прямая запись RTF; AFAIK, TRichEdit обеспечивает прямой доступ к RTF-коду; просто переключите свойство PlainText на False, затем установите свойство Text string. Но ... удачи в сборке правильного кода RTF.
  • Конвертируйте свой журнал в HTML и используйте элемент управления TWebBrowser для его отображения.
  • Используйте элемент подсветки Scintilla (или другой), а также переместите свой собственный ярлык синтаксиса ...

Если вы сами записываете журнал, вы также можете использовать TRichEdit для генерации журнала в RTF. Или вы можете сгенерировать журнал в формате HTML или в формате XML (который затем может быть преобразован во все, что вам нравится, используя XSLT).

Дельфы, каротаж, Дельфы-2009, РТФ,
Похожие вопросы