Автор |
Сообщение |
Snake!
Репутация: 0
Сообщения: 1941
Стаж: 3 года 4 месяца
|
24.07.2006 20:03 Подсветка кода в managed c++ |
|
|
Подскажите, как можно реализовать сабж.
Надо сделать в текст боксе подсветку отдельных слов (если это возможно конечно).
И какие есть вообще алгоритмы разбора выражений? У меня пока что только одна идея есть: при изменении содержимого бокса просматривать весь текст, предварительно записывая каждый токен в структуру, потом сравнивать каждый элемент структуры со словарём и выводить определённым цветом.
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
25.07.2006 8:39 |
|
|
В теории надо писать свой контрол и работать с процедурой вывода в окно (анализировать только область вывода). Если внимательно посмотреть на большинство редакторов с подсветкой, то они создаются на базе не текствого поля (типа rtf) а на основе grid control.
Вообще регулярные выражения очень могут помочь. Я в свое время брался писать, но потом плюнул. Очень много нюансов.
Лучше поискать готовый контрол, которому скармливается словарь и правила. Нечто подобное реализовано в текстовом редакторе Aditor.
Если решишь задачу, дай знать. Тоже интересно ...
|
|
Вернуться к началу |
|
|
Blackmore
Репутация: 0
Сообщения: 1334
Стаж: 3 года 4 месяца
|
25.07.2006 10:42 |
|
|
Попробуй классик Regex посмотреть, проблему поиска токенов должен решить.
_________________ she turns and says "are you alright?"
I said "I must be fine cause my heart's still beating"
|
|
Вернуться к началу |
|
|
Snake!
Репутация: 0
Сообщения: 1941
Стаж: 3 года 4 месяца
|
25.07.2006 11:32 |
|
|
roman koff
Вообще-то есть способо разбора текста при помощи написаня программ под flex и yacc (или bison), но мне они не особо нравятся, так что я думал как-нить по другому решить данный вопрос.
А прога, написанная с использованием вышеуказанных пакетов есть, могу кинуть потом.
Кстати, наткнулся на хороший редактор scintilla, идёт вместе с исходниками под всё =) сейчас разбираюсь.
Blackmore
Угу, посмотрю.
|
|
Вернуться к началу |
|
|
Snake!
Репутация: 0
Сообщения: 1941
Стаж: 3 года 4 месяца
|
26.07.2006 22:14 |
|
|
Я тут нарыл простенький транслятор, который разбирает строку на выражения. Мона потом выражения на выходе сравнивать со словарём и выводить на экран нужным цветом. По крайней мере при загрузке файла всё просто: читаем весь текст и выводим. А вот как реализуется подсветка по время редактирования конкретного текста я пока не очень понимаю. Видимо надо смотреть от начала редактируемого слова и до конца текста.
Кстати, код который генерирует flex и yacc почему-то отказывается работать с пользовательскими классами. Может кто-нибудь работал с этими пакетами и знает, как это дело "лечить"?
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
27.07.2006 8:27 |
|
|
Flex и yacc вещи, конечно мощные, но их надо потом аккуратно доводить до ума (до современных платформ).
По поводу разбора текста, во всех популярных языках существуют встроенные высокоуровневые методы для реализании задачи, например instr для (C/VB).NET, а также регулярные выражения. Несложно самому написать парсер.
А вот с подсветкой текста при редактировании - это непростая логическая задача. Надо аккуратно продумывать логику и оптимизацию алгоритма.
На многих программистких форумах эта тема периодически мусолится, но решения я пока не видел. Наверное кто знает как - молчит в тряпочку
|
|
Вернуться к началу |
|
|
Blackmore
Репутация: 0
Сообщения: 1334
Стаж: 3 года 4 месяца
|
27.07.2006 16:29 |
|
|
Первое, что мне пришло в голову, это не разбивать весь текст на токены, а следить за последним редактированным токеном. Ловить к примеру OnTextChanged для текстбокса, выдергивать токен и подсвечивать его, если надо.
_________________ she turns and says "are you alright?"
I said "I must be fine cause my heart's still beating"
|
|
Вернуться к началу |
|
|
Snake!
Репутация: 0
Сообщения: 1941
Стаж: 3 года 4 месяца
|
27.07.2006 21:33 |
|
|
Blackmore
А если ты допустим п строке "in t" убираешь пробел, то твоя тема по-идее не будет работать, а должна.
|
|
Вернуться к началу |
|
|
roman koff
Репутация: +2
Пол:
Откуда: Санкт-Петербург
Сообщения: 369
Стаж: 2 года 10 месяцев
|
28.07.2006 8:36 |
|
|
А если вставляется/вырезается буфер обмена?...
|
|
Вернуться к началу |
|
|
Blackmore
Репутация: 0
Сообщения: 1334
Стаж: 3 года 4 месяца
|
28.07.2006 11:54 |
|
|
Snake! писал(а): А если ты допустим п строке "in t" убираешь пробел, то твоя тема по-идее не будет работать, а должна.
Ну почему. Если убрать пробел, то получится новый токен "int", который можно выцепить из строки и подсветить если надо (:
Надо бы попробовать конечно, но мне лень (:
_________________ she turns and says "are you alright?"
I said "I must be fine cause my heart's still beating"
|
|
Вернуться к началу |
|
|
|
|