Алгоритм подсветки синтаксиса, Теория и практика |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Алгоритм подсветки синтаксиса, Теория и практика |
TarasBer |
5.03.2010 16:42
Сообщение
#1
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Начну с практики. Для подсветки нужен ведь ТРичЕдит? Я так понял, что надо пробежать по тексту, выделяя разные его куски и меняя цвет этих кусков через СелАттрибутес. Проблема в том, что этот процесс виден пользователю. Я пробовал отрубить перерисовку компонента на время раскраски через посылку сообщения ВМ_СЕТРЕДРАВ, а потом вызвать метод Инвалидате. Но проблема тут в том, что это Инвалидате сначала чистит окно, а потом выводит текст, то есть создаёт мерцание. Вопрос - как раскрасить текст, чтобы пользователю не был виден процесс раскрашивания, а был виден только результат?
Теория. Какие вообще алгоритмы есть? Прогон всего текста при каждой операции неэкономичен. Прогон только ближайшего к курсору слова при каждом изменении? А что делать после операций с блоками текста? Ни у всякие такие вопросы. В общем, есть ли какая-то общая теория на эту тему? -------------------- |
volvo |
5.03.2010 16:56
Сообщение
#2
|
Гость |
DRKB -> VCL -> TMemo -> Delphi-компонент для подкраски синтаксиса
Цитата Примечание Vit Все способы подкраски синтаксиса реализованные через RichEdit грешат одним существенным недостатком - они реализованы через изменение атрибутов текста. И чем это грозит? А представьте себе что вы загрузили файл Дельфи, большой такой на пару мегабайт, например интерфейс от какого-то ActiveX от MS Word... и решили написать комментарий в начале файла, открываете скобку "(*" и ... ждёте секунд 10, а то и минуту пока изменятся атрибуты у всего файла, затем закрываете скобку "*)" и ждёте следующие пол минуты... Если же текст побольше, например вы загрузили какой-нибудь XML мегабайт на 50, то тогда после каждого нажатия клавиши у вас будет время выпить пивка и пройти уровень в Quake (желательно на другой машине, чтоб не тормозила)... И что же делать? А то что сам метод порочен по своей сути! Зачем вам подкрашивать 50 мегабайтов текста при нажатии на клавишу если реально надо подсветить только то что вы видите не экране! А это всего-лишь максимум 10 Kb текста, но обычно и вовсе 1-2 Kb... Кроме того, зачем менять аттрибуты? Ведь Вам же не надо ничего специального делать с зелёными словами, причём так чтобы это не коснулось синих слов?!! Изменение атрибутов в RichEdit мероприятие само по себе очень долгое, ведь по сути дела меняется сам поток данных! В данном случае достаточно только изменить прорисовку текста, т.е. как этот текст рисуется на экране, не меняя сам текст и его атрибуты совершенно! Фактически всё что вам надо сделать - это поменять процедуру прорисовки текста компонента, но это в теории, на практике всё гораздо сложнее... Но логика та же. Именно так работают и все редакторы с подсветкой синтаксиса - и от Борланда, и от MS, и от сторонних производителей. Чтоб не тратить время на изобретение велосипеда предлагаю применять компонент SynEdit - самый совершенный на сегодняшний день аналог Memo с подсветкой синтаксиса Посмотри, как делает SynEdit... Также можно посмотреть в сторону обертки над Scintilla, для Дельфи тоже есть интерфейс. |
TarasBer |
5.03.2010 17:11
Сообщение
#3
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
То есть по сути делают свои аналоги ТМемо с переделанной функцией отрисовки?
-------------------- |
volvo |
5.03.2010 18:09
Сообщение
#4
|
Гость |
Да. По крайней мере все сколько-нибудь прилично работающие подсветки построены именно по такому принципу.
|
Прохожий |
10.11.2012 18:59
Сообщение
#5
|
Гость |
Пляски с Селаттрибутес надо устраивать не по всему тексту, а только в той его части, что видна в окне - это совсем небольшой объем. Перед циклом "выделение - смена цвета" поставить ЛайнесБегинАпдейт, после - ЛайнесЭндАпдейт - тогда раскраска будет возникать в окне вся сразу, без мельтешения.
Процедуру раскраски привязать к событию ОнКейАп для навигации по тексту. Но не ОнКейДаун, понятно, почему |
IUnknown |
10.11.2012 19:04
Сообщение
#6
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Это теоретические измышления. Практическая реализация тут же покажет несостоятельность этих измышлений. Всё это хорошо "на бумаге", и если бы было так просто - то и вопросов бы не было.
|
Прохожий |
10.11.2012 20:34
Сообщение
#7
|
Группа: Пользователи Сообщений: 1 Пол: Мужской Репутация: 0 |
на практике это работает
(загружен сборничек произведений 20 мб, подсвечены имена собственные и омографы в тексте) Сообщение отредактировано: Прохожий - 10.11.2012 20:41 Эскизы прикрепленных изображений |
TarasBer |
11.11.2012 20:23
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
А я вообще свой велоEdit сделал. А фигли, если стандартный не даёт нормально перехватить отрисовку.
Ну и со всякими фишками заодно, типа длинный буфер правок (а не на 1 операцию), таб по выделенному тексту как сдвиг вправо... -------------------- |
Текстовая версия | 24.09.2024 17:07 |