|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
Работа с текстовым редактором Scintilla16.11.2022, 21:30. Показов 9033. Ответов 99
Метки нет (Все метки)
Доброго времени суток ! Тружусь над небольшой программкой, в которой у меня будет редактор кода на основе "Scintilla". Столкнулся с такой задачкой: нужно, чтобы при нахождении ключевого слова, происходила его замена. По типу как в пурике - если пользователь написал ключевое слово в нижнем регистре, редактор его заменил на то, как эти ключевые слова хранятся в программе. К примеру, пользователь прописал "for" -> редактор сменил на "For". При этом, пурик, как известно, подсветку производит непосредственно как только обнаруживает ключевое слово, а замену делает при наборе следующего символа. При этом, символ должен быть либо пробел, либо скобка, либо переход на новую строку и т.п.
Выкладываю свой самый сокращенный вариант для примера. В нём зарезервировано только одно ключевое слово "For", ну этого достаточно для теста. Тут я пытаюсь добиться желаемого, но как-то некорректно это происходит. В строчках 89, 90 как раз пытаюсь прописать эту замену, но почему-то она не работает как нужно. Подскажите, пожалуйста, в чём ошибка ? Как только не пытался экспериментировать, никак не могу добиться желаемого. Документацию по Scintilla уже раз 40 пересматривал, изучал, но там тоже не так просто разобраться. Она таким тяжелым языком написана, а более понятной и доступной нигде не найти. В общем, вот мой пример поиска решения, дальше которого я никак не могу продвинуться. Помогите, пожалуйста, если есть кто-то компетентный.
0
|
||||||
| 16.11.2022, 21:30 | |
|
Ответы с готовыми решениями:
99
Работа с текстовым редактором Работа с текстовым редактором Помогите с текстовым редактором! |
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
| 28.11.2022, 10:21 [ТС] | ||||||
|
Я понял. Скорее всего, регулярными выражениями здесь не получится окрашивать фразы, если только отдельные символы, заключённые в одной регулярке. Одно выражение, состоящее из нескольких символов в разные цвета он не окрасит. А раз он этого не может сделать, то и не выполняется SCI_SETSTYLING, а следовательно непрерывно отправляются запросы на перерисовку. Насколько я понял, тут суть следующая - ввёл символ - вся строка начинает от первого символа до позиции Pos посимвольно окрашиваться пока не дойдёт до Pos. Если все перекрашивания удачны, запросы на раскрашивание прекращаются. Если какой-то символ не удалось покрасить - он снова отправляет запрос на перекрашивание. И может даже зависнуть. После каждого внесения изменений в строку, начинается посимвольная перекраска до позиции Pos
Добавлено через 10 минут Если, к примеру, надо несколько символов сделать одним стилем, то только эта группа окрасится в один стиль, где начало и конец окраски задаёт
0
|
||||||
| 28.11.2022, 10:26 | |
|
Я тоже понял, что событие требует покраски хотя бы одного символа, ведь он же введён, то есть после каждого уведомления должен сработать SCI_SETSTYLING не меньше одного раза, который выдаст флаг, что операция покраски завершена, а пока флаг не переключился он так и будет слать уведомление о перекрашивании.
Ты ошибаешься, несмотря на то что регвыр красит поверх при умении можно сделать нормальное подкрашивание. У меня даже код PureBasic подкрашивается. Я уже сделал регвыр наверно для 7 файлов.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 10:37 [ТС] | ||
- он это сделает, и будет двигаться дальше. Главное, чтоб неокрашенных символов не оставалось позади.
0
|
||
| 28.11.2022, 11:04 | |
|
antro735, ты решаешь задачу не покраски, а соответствия регистра для ключевых слов, для покраски алгоритм можно сделать совершенно иной. Получил начало и конец строки и прогнал поиск по строке ключевых слов с помощью регулярных выражений или обычного поиска "целого слова", у поиска есть флаг "целое слово".
Не все вещи можно задать ключевыми словами, например как ты задашь поиск файлового пути, GUID, шестнадцатеричных чисел, констант в PureBasic, которые определяются префиксом # и т.д. Хотя частично можно писать алгоритмы аналогичные движку регулярных выражений, но это изобретать велосипед, если хочешь сделать поддержку регвыр для пользователей, то если в программе уже будет встроен движок рег.выр, то почему бы не воспользоваться и сделать поддержку подсветки с помощью рег.выр. для пользователей как это сделано в AkelPad.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 11:15 [ТС] | |
|
AZJIO, Тут тоже согласен, алгоритм раскраски можно изменить. Но если он выполнился без ошибок, SCI_STARTSTYLING перестаёт отправлять запросы на стилизацию, и всё будет ровно
0
|
|
|
|
||||||
| 28.11.2022, 11:57 | ||||||
Из-за него эти события.
0
|
||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||||||||
| 28.11.2022, 12:38 [ТС] | ||||||||||||
|
Залил себе. Открыл, помотрел. Самое интересное знаешь в чём
Редактор, над которым сейчас тружусь я, тоже с практически такой же тёмной темой Правда, я ещё предоставил возможность переключаться темам - светлая и тёмная. Ты его чисто для себя писал ? для своих нужд и удобства ?Добавлено через 10 минут
Добавлено через 24 минуты И ещё... Я сейчас приступил к индикаторной подсветке выделенного слова в тексте. Ну, как в пурике - выделил слово, и по всему тексту где оно встречается, оно подсвечено индикатором. Но тут столкнулся с непонятным явлением. Не знаю, это или у меня пурик глючит, или что-то другое. В общем, мне нужно добавить символ "$" в стандартный набор символов слова. Там это делается через указатель на эту строку. Так вот, если у меня строка короткая, то всё нормально. Например:
"Невозможен доступ к памяти(ошибка чтения по адресу 548.......)" Вот тут уже выдаёт постоянно эту ошибку:
0
|
||||||||||||
| 28.11.2022, 12:56 | |
|
locm, курсор и в ваших примерах мигает, но уведомление то не приходит. тут мы достоверно установили причину, нужна отработка SCI_SETSTYLING. Я выше писал, если текст подкрасился то уведомления не шлются, а если я ввёл русские буквы, которые не подвергаются подкрашиванию и не срабатывает SCI_SETSTYLING, то идут уведомление SCN_STYLENEEDED.
antro735, для себя и для всех. Если я выкладываю, значит любой может пользоваться.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 13:26 [ТС] | |
|
AZJIO, так-то неплохо. Нумерацию строк не стал делать ? Просто как блокнот ? Или дорабатывать будешь ?
0
|
|
| 28.11.2022, 13:52 | |
|
antro735, так там ещё дорабатывать и дорабатывать. Сегодня добавил распознавание кодировки UTF-8 без BOM, нагуглил код на оф.форуме и уже добавил эту функцию в свою справку. На днях затесалась проблема со шрифтом вот сейчас исправил, сравнил исходник 7 и 8 между которыми появилась проблема и вычленил проблему, как на зло я ещё делал форматирование отступов и разница была почти в каждой строке, тупо блоками в Meld возвращал 8 к 7 и запускал, так что перекачивай, там уже новое исправленное.
А вообще если раньше я как то придерживался темы выясняя поведение движка то теперь мы отошли от темы, лучше на каждый новый вопрос и обсуждение моей проги создать новую тему.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 15:44 [ТС] | |
|
Нет, AZJIO, там в посте ссылка есть на скачивание, но самого файла нет, только надпись "File was deleted by user."
0
|
|
|
|
||||||||||||||||||||||
| 28.11.2022, 17:30 | ||||||||||||||||||||||
1
|
||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 18:49 [ТС] | ||
|
Благодарю, locm ! Не перестаю удивляться - это же какой объём информации и знаний должно находиться в голове, чтобы так хорошо ориентироваться и знать столько тонкостей !!!? Включил Purifier. Сейчас в протоколе ошибок фиксирует ошибку по-другому, пишет: "overflow in a dynamically allocated memory block". То есть, "переполнение в динамически выделяемом блоке памяти", вместо "ошибка чтения по адресу .....", а это уже конкретная причина сбоя исполнения программы. Чтобы точно убедиться, что я правильно понял Вашу подсказку, Purifier так и работает и я верно сделал настройку ?
Добавлено через 13 минут
SCI_SETWORDCHARS(<unused> , const char *characters) Это сообщение определяет, какие символы являются членами категории слов. Перед обработкой этой функции категории символов устанавливаются значения по умолчанию. Например, если вы не разрешаете '_' в вашем наборе символов использовать: SCI_SETWORDCHARS (0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM NOPQRSTUVWXYZ0123456789") ; Вот тут я ещё не знаю, const char *characters - как правильно понимать ? Имеется ввиду заполненная область памяти, или достаточно указателя на строку ?
0
|
||
|
|
||||||||
| 28.11.2022, 19:39 | ||||||||
|
По сути это
0
|
||||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 19:59 [ТС] | ||
0
|
||
| 29.11.2022, 11:24 | |
|
Посмотри ссылки плаги Notepad++, код-архив (в последней папке есть Scintilla и ещё найди там автора eddy в его папке примеры Scintilla и ссылки на оригиналы)
1
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 29.11.2022, 15:42 [ТС] | |
|
Благодарю, AZJIO ! Я тем временем с подсветкой одинаковых слов в тексте закончил, за автозавершение взялся.
0
|
|
| 30.11.2022, 03:01 | |
|
antro735, я не любитель нативного автозавершения, если функционал будет выглядеть как вставка конструкций кода, то это можно принять, иначе делать собственный вариант, погугли "AutoCompletionIDE"
На счёт My_Notepad_Sci ссылка на яндекс всегда исправная, а на upload.ee там нет обновлений, а каждый раз на всех ресурсах обновлять ссылку и перезаливать немного напрягает. На яндекс.диск просто кидаешь файл в окно браузера и файл обновляется, а ссылка остаётся та же. Кстати на оф.форуме примеров Scintilla полно, но они старые с использованием WinAPI для создания окна, когда видимо Scintilla ещё не была внутренним гаджетом, но можно подсмотреть концепцию. Я искал работу с нативными подсветками используя #SCI_SETLEXER и выяснил что Scintilla может быть скомпилирована с лексерами и без, видимо вариант в PureBasic скомпилирован без лексеров, а также без поддержки SCFIND_CXX11REGEX, так как я не смог использовать более продвинутые рег.выр. взамен нативного урезанного.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 30.11.2022, 04:50 [ТС] | ||
|
AZJIO, не знал, что можно через яндекс так обновлять файлы. Не знаю, как это работает, ну, да, ладно, не до этого сейчас. Обновил My_Notepad_Sci.
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600) просто посмотреть как он с ними будет справляться. И тут начинаются нереально жуткие тормоза - что у меня, что в My_Notepad_Sci. Однако, этого не наблюдается в том редакторе, пример которого у меня есть. И написан он тоже на PureBasic. Никаких тормозов. Правда, там почти 2500 строк кода, много разных модулей. Моего уровня пока не хватает, чтоб разобраться в том исходнике. Что-то я там понимаю, но далеко не всё. Могу выложить сюда исходник, только, не знаю, можно ли такой длинный код здесь выкладывать ? Не забанят ? Добавлено через 5 минут В My_Notepad_Sc начинаются тормоза когда включаешь его в режим подсветки pb
0
|
||
| 30.11.2022, 04:50 | |
|
Помогаю со студенческими работами здесь
60
Помощь с текстовым редактором Ввод и вывод массива с текстовым редактором Обработка больших файлов текстовым редактором Сценарий PowerShell для работы с текстовым редактором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|