Пример выделения синтаксиса? - PullRequest
3 голосов
/ 04 сентября 2010

Есть ли какой-нибудь простой пример кода или как сделать так, чтобы элемент управления richedit делал подсветку синтаксиса? Я попробовал SynEdit, но это очень и очень сложно для меня, мне было интересно, есть ли там небольшой фрагмент кода, над которым я могу работать? или просто идея о том, как сделать это так быстро, как это делают IDE?

веселит;

Ответы [ 4 ]

14 голосов
/ 04 сентября 2010

Я думаю, что работать с компонентами SynEdit гораздо проще, чем создавать собственную подсветку синтаксиса на основе TRichEdit .

1.Введите компонент TSynEdit в форму из поддона SynEdit

2. Выберите Highligther из поддона SynEdit Highligthers

3.set Свойство Highlighter в TSynEditcomponent.

alt text

В любом случае, если вы настаиваете на использовании RichEdit, попробуйте эти ссылки.

10 голосов
/ 05 сентября 2010

Проект SynEdit (или, точнее, его предшественник mwEdit) был запущен именно потому, что стандартный элемент управления rich edit очень плохо подходит для подсветки синтаксиса.

Элемент управления rich edit работает, сохраняя содержащийся фрагмент в тексте с помощьюформатирование информации для каждого из фрагментов текста.Теперь представьте элемент управления подсветкой синтаксиса для Pascal, построенный поверх него.Для вставки { в качестве первого символа текста потребуется отсканировать весь текст до первого }, который не находится внутри строки, и перебрать все фрагменты до того, который содержит }, изменяя форматированиетекст для форматирования для многострочных комментариев, затем повторно выделите оставшуюся часть текста.А удаление вставленного символа или отмена редактирования аналогично потребует повторного выделения всего текста.Теперь делать это несколько раз в секунду для быстрой типизации оказалось невозможным быстрым и без мерцания на машинах конца девяностых.

Таким образом, все быстрые средства редактирования с подсветкой синтаксиса реализованы как пользовательские правкиэлементы управления, а не как потомки стандартных элементов управления Windows.Они реализуют все хранение текста, отрисовку и редактирование текста для себя.Обычно используется ряд предопределенных текстовых атрибутов (для ключевых слов, комментариев, символов, чисел и т. Д.), И для каждого видимого символа определяется используемый текстовый атрибут, затем для рисования текста устанавливаются атрибуты шрифта и цвета, и всесимволы с одним и тем же атрибутом закрашиваются.

Существует два основных способа сделать это: первый - рассчитать выделенную информацию один раз и сохранить информацию для каждого символа в тексте (например, как работает текстовый элемент управления Scintilla)), другой - повторно сканировать текст каждый раз, когда он должен быть нарисован (так работает SynEdit).SynEdit оптимизирует это, сохраняя начальное состояние для каждой строки, поэтому для рисования строк с 1000 по 1010 не требуется повторное сканирование с первой строки, он инициализирует текущую подсветку синтаксиса с сохраненным состоянием для строки 1000 и просматривает оттуда.

Хранение информации о каждом персонаже требует больше места, но имеет несколько преимуществ.Первый текст может быть выделен, даже если информация о выделении не может быть определена из одного текста, например, сообщения журнала с отметками времени;и, во-вторых, данные для каждого символа могут использоваться для хранения дополнительной информации, например, для свертывания текста или для информации, какие символы были вставлены или изменены.

Я не думаю, что сегодня реалистично реализовать синтаксисуправление выделением с нуля, для произвольных размеров текста, в комплекте с поддержкой Unicode, полная отмена / повтор, многократные просмотры, свертывание кода и т. д. одним человеком.Или, может быть, это можно сделать, но этот человек должен был бы ознакомиться с внутренними элементами существующих элементов управления подсветкой, чтобы не принимать ошибок или неоптимальных решений, которые были приняты при их создании.

1 голос
/ 04 сентября 2010

Вы можете посмотреть в источнике Gexperts. Существует « Source Export », основанный на Pascal Parser IIRC Мартина Вальденбурга.
Но я не уверен, что это "просто".

0 голосов
/ 07 сентября 2010

Я использую LMD SyntaxEdit, и это довольно хорошо. Это идет с примерами и документами. Подсветка синтаксиса никогда не бывает простой, но после нескольких часов работы с этим компонентом вы должны начать работу.

...