Помощь - Поиск - Пользователи - Календарь
Полная версия: Алгоритм подсветки синтаксиса
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
TarasBer
Начну с практики. Для подсветки нужен ведь ТРичЕдит? Я так понял, что надо пробежать по тексту, выделяя разные его куски и меняя цвет этих кусков через СелАттрибутес. Проблема в том, что этот процесс виден пользователю. Я пробовал отрубить перерисовку компонента на время раскраски через посылку сообщения ВМ_СЕТРЕДРАВ, а потом вызвать метод Инвалидате. Но проблема тут в том, что это Инвалидате сначала чистит окно, а потом выводит текст, то есть создаёт мерцание. Вопрос - как раскрасить текст, чтобы пользователю не был виден процесс раскрашивания, а был виден только результат?
Теория. Какие вообще алгоритмы есть? Прогон всего текста при каждой операции неэкономичен. Прогон только ближайшего к курсору слова при каждом изменении? А что делать после операций с блоками текста? Ни у всякие такие вопросы. В общем, есть ли какая-то общая теория на эту тему?
volvo
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
То есть по сути делают свои аналоги ТМемо с переделанной функцией отрисовки?
volvo
Да. По крайней мере все сколько-нибудь прилично работающие подсветки построены именно по такому принципу.
Прохожий
Пляски с Селаттрибутес надо устраивать не по всему тексту, а только в той его части, что видна в окне - это совсем небольшой объем. Перед циклом "выделение - смена цвета" поставить ЛайнесБегинАпдейт, после - ЛайнесЭндАпдейт - тогда раскраска будет возникать в окне вся сразу, без мельтешения.
Процедуру раскраски привязать к событию ОнКейАп для навигации по тексту. Но не ОнКейДаун, понятно, почему smile.gif
IUnknown
Это теоретические измышления. Практическая реализация тут же покажет несостоятельность этих измышлений. Всё это хорошо "на бумаге", и если бы было так просто - то и вопросов бы не было.
Прохожий
на практике это работает
(загружен сборничек произведений 20 мб, подсвечены имена собственные и омографы в тексте)
TarasBer
А я вообще свой велоEdit сделал. А фигли, если стандартный не даёт нормально перехватить отрисовку.
Ну и со всякими фишками заодно, типа длинный буфер правок (а не на 1 операцию), таб по выделенному тексту как сдвиг вправо...
nishaknapp
Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. Myths About Slot Machines: Let’s Debunk Them
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.