Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
В общем, стукноло мне как-то в голову написать редактор кода (не важно какого, любого). Ну и соответственно хочеться чтоб ключевые слова выделялись другим цветом... Короче все как Visual Studio например. Вот встал вопрос, как это реализовать? Первый очевидный ответ, заюзать RichTextBox и там красить, но честно говоря вариант не из лутших... Во-первых нужно учитывать кучу всяких вариантов, после применения SelctedTextColor (так помоему наз-ся) вводимый текст начинает краситься в тот же цвет. Во-вторых выделение текста не иногода не успевает прорисоваться достаточно быстро чтобы быть незаметным, а это очень раздражает. Короче есть куча претензий которые заставляют подумать о альтернативном варианте. Отсюда вопрос, а какой вариант? Сразу говорю, варианты типа, залазим на сайт такой то, качаем такойто контрол и радуемся жизни не подходит (хотя бы потому что не интерестно) Можно ли обойтись без System.Drawing? Хотелось бы услышать ваши размышления по этому поводу... _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 11:35 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Да в RichTextBox текст красить с помощью SelctedTextColor - последнее дело, так некрасиво получается, что аж противно. Я вот было время решил на Дельфи написать среду разработки для PHP, т.к. все известные мне среды для него меня раздражают своей недоделанностью. Ещё толком не начал писать, как стал папой и время на хобби быстро улетучилось :). Соображения такие: - перехватывать нажатия клавиш и подкрашивать слова только когда слово написано и опознанно как ключевое. - оформить всё естественно в виде класса/классов, для удобства :) - унаследоваться от RichTextBox и создать его расширенную версию так сказать.... Я сделал всё что мог, кто может пусть сделает лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 12:10 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
M234 - перехватывать нажатия клавиш и подкрашивать слова только когда слово написано и опознанно как ключевое. - оформить всё естественно в виде класса/классов, для удобства :) - унаследоваться от RichTextBox и создать его расширенную версию так сказать.... Сделать свой контрол от RichEditBox - это хорошая идея. Только опять же - понадобится анализ текста и расцветка (например в случае загрузки существующего файла) Можно сделать один класс с поддержкой нескольких языков программирования - нужно сделать коллекции слов для каждого из поддерживаемых языков плюс проверку синтаксиса (типа проверку констант и т.д.). Проверять и подкрашивоть слова при вводе текста можно только после ввода символов-разделиделей (space ; , = & etc) Раскрашивать можно путем вставки кодов RTF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 12:41 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Проверять и подкрашивоть слова при вводе текста можно только после ввода символов-разделиделей (space ; , = & etc) Да, но делать это надо так сказать "за кадром", без использования ф-ий RichTextBox`а SelctedTextColor и прочих. Я сделал всё что мог, кто может пусть сделает лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 12:56 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Ключевые слова можно перехватывать при помощи регулярных выражений (Regex). К примеру: Код: plaintext 1. 2. 3. Найдет "new" в тексте, а "newArr" пропустит мимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 12:57 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
M234 Да, но делать это надо так сказать "за кадром", без использования ф-ий RichTextBox`а SelctedTextColor и прочих. Использовать RichTextBox.Rtf ? Добовляя/удаляя из него коды RTF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 14:11 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
И все же, что будет производительней, прямой перехват вводимых символов или регулярные выражения? Перехват не плох, но очень объемен по размеру кода. Регулярные выражения тоже ничего, но каждый раз сканить весь текст не особо прикольно... хотя можна например сканить только активную строку... и работает для файл открытия файлов... Согласен, вставка RTF тегов гораздо лутше чем SelectedTextColor... уж покрайней мере выглядит сипатичней :) _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 12:39 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Я писал в своей проге a la SQL Query Analyzer syntax highlight для T-SQL с использованием регулярных выражений. На о объемах до пары сотен строк работает очень даже ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 13:16 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Вот мне типа того и надобно... но вот хотелось бы приличную производительностьпри объемах близких к тысяче строк... Ну ежли на выходных времени немоного будет, попробую... и обательно раскажу о результатах :) _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 13:29 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
viperИ все же, что будет производительней, прямой перехват вводимых символов или регулярные выражения? если просто надо раскрасить ключевые слова, то имхо, делаем массив этих самых ключевых слов, а лучше хештаблицу "первая буква кл.слова - всё слово", перехватываем нажатия клавишь посимвольно, выбираем слово из хэштаблицы по первому символу, заводим какой-то указатель на символ в строке и двигаем его, пока приходят правильные чары. Если дошли до конца(+пробел) - слово ключевое, красим и выделяем, если пришёл сивол, которого нет в строке - откатываетмся к выбору из хештаблицы. Должно быть быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 19:52 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
если несколько кл. слов на одну букву - тогда в хештаблице не строка, а дерево символов. И при приходе неправильного чара для текущей ветви надо проверять все остальные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 19:55 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Dronopotamus если просто надо раскрасить ключевые слова, то имхо, делаем массив этих самых ключевых слов, а лучше хештаблицу "первая буква кл.слова - всё слово", перехватываем нажатия клавишь посимвольно, выбираем слово из хэштаблицы по первому символу, заводим какой-то указатель на символ в строке и двигаем его, пока приходят правильные чары. Если дошли до конца(+пробел) - слово ключевое, красим и выделяем, если пришёл сивол, которого нет в строке - откатываетмся к выбору из хештаблицы. Должно быть быстро. Это так до тех пор пока не задумаешься о существовани комментариев -строчных и блочных, строковых константах и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 21:07 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Мда, с коментариями лажа получаеться... причем самые противные коментарии типа /*.....*/ , прийдеться хранить еще и статус строки (содержит коментарий/ не содержит)... А может даже луише хранить начальную и конечную позицию в тексте всех коментариев... Громоздко получаеться , однако, но лутшего варианта я пока не вижу, мож у кого-то есть идеи на сей счет? _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 21:37 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
Ну и раз уж пошла такая пьянка, предлагаю подумать еще и над таким вопросом, охота понятное дело после определенного оператора (., -> ну и тд) вываливать список членов. Как с таким бороться? Возьмем самый простой случай, sql... тоесть нужно проследить за всеми локальными/лобальными переменными/временными таблицами (с колонками таблиц все и так ясно). Моя думает что походу дела еще не мешало бы строить дерево этих вещей (корень название процедуры/батча и т.д, листья соответственно переменные/таблички). Но вот как определить в теле чего мы находимся? Опять сканить? Или еще и ко всему хранить позиции начала и конца? ЗЫ Я понимаю,что как-то странно выглядит, я задаю вопросы и сам на них пытаюсь ответить но скажем так, не то, что я вообще не знаю как это реализовать, просто я хочу услышать ваше мнение, может я что-то не так понимаю или просмотрел какой-то вариант... _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 21:49 |
|
||
|
Редактор кода
|
|||
|---|---|---|---|
|
#18+
viperМда, с коментариями лажа получаеться... причем самые противные коментарии типа /*.....*/ , прийдеться хранить еще и статус строки (содержит коментарий/ не содержит)... А может даже луише хранить начальную и конечную позицию в тексте всех коментариев... Громоздко получаеться , однако, но лутшего варианта я пока не вижу, мож у кого-то есть идеи на сей счет? Я приблизительно так и делаю. Дроблю текст на лексемы. Держу в памяти таблицу лексем, при введении, изменении символа(ов), пересматриваю от введенной позиции до первой "неизмененной" лексемы. Только этот участок и перераскрашиваю. Выношу на суд общественности свой исходник. Если кто выскажет конструктивные замечания буду только рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2004, 01:27 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=32565407&tid=1438982]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 382ms |

| 0 / 0 |
