|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
Работа с текстовым редактором Scintilla16.11.2022, 21:30. Показов 10040. Ответов 99
Метки нет (Все метки)
Доброго времени суток ! Тружусь над небольшой программкой, в которой у меня будет редактор кода на основе "Scintilla". Столкнулся с такой задачкой: нужно, чтобы при нахождении ключевого слова, происходила его замена. По типу как в пурике - если пользователь написал ключевое слово в нижнем регистре, редактор его заменил на то, как эти ключевые слова хранятся в программе. К примеру, пользователь прописал "for" -> редактор сменил на "For". При этом, пурик, как известно, подсветку производит непосредственно как только обнаруживает ключевое слово, а замену делает при наборе следующего символа. При этом, символ должен быть либо пробел, либо скобка, либо переход на новую строку и т.п.
Выкладываю свой самый сокращенный вариант для примера. В нём зарезервировано только одно ключевое слово "For", ну этого достаточно для теста. Тут я пытаюсь добиться желаемого, но как-то некорректно это происходит. В строчках 89, 90 как раз пытаюсь прописать эту замену, но почему-то она не работает как нужно. Подскажите, пожалуйста, в чём ошибка ? Как только не пытался экспериментировать, никак не могу добиться желаемого. Документацию по Scintilla уже раз 40 пересматривал, изучал, но там тоже не так просто разобраться. Она таким тяжелым языком написана, а более понятной и доступной нигде не найти. В общем, вот мой пример поиска решения, дальше которого я никак не могу продвинуться. Помогите, пожалуйста, если есть кто-то компетентный.
0
|
||||||
| 16.11.2022, 21:30 | |
|
Ответы с готовыми решениями:
99
Работа с текстовым редактором Работа с текстовым редактором Помогите с текстовым редактором! |
| 30.11.2022, 10:44 | ||||||||||||
|
antro735, SCI_AUTOCSETMAXHEIGHT это максимальная высота раскрывающегося списка без прокрутки, причём как я понимаю размер указывается в количестве пунктов, так как по умолчанию 5. Ну 5 пиксель точно быть не может, значит 5 пунктов, а я ещё по раскрывающемуся списку Windows помню, что там высота как раз таки указывается в количестве пунктов. Получается что максимальная высота умещающаяся на экран примерно 30, при условии что у меня шрифт 11 вместо стандартного 8,5 в Windows а высота монитора 1024. Каким образом ты умудряешься выставить 5000? У тебя монитор как 5-этажный дом?
Добавлено через 3 часа 6 минут Попробуй внутренний лексер применить, расскажешь как он заработал. https://www.purebasic.fr/engli... hp?t=32304
0
|
||||||||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||||
| 30.11.2022, 13:43 [ТС] | ||||||||
Нет, конечно. Я имел ввиду, что я брал первую попавшуюся на глаза строку, скопировал, и вписал её 5000 раз в испытуемый редактор каждый раз с новой строки. Просто, попалась под руку строка:ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600) вот, её и вставлял в качестве экспериментального текста по принципу
Я так понимаю, что можно обойтись имеющимися средствами PureBasic-а. Нужно только с правильной стороны подойти. В этом зарубежном исходном коде много модулей. Теперь, вот, сижу, изучаю тему модулей. Это тоже для меня ещё не освоенная область. Надо и с модулями научиться работать. Хотел здесь выложить исходный код редактора с зарубежного форума, но не получается - слишком длинный.
0
|
||||||||
| 30.11.2022, 16:25 | |
|
1. У меня тормозит длиный код, потому что подсветка выполнена неправильно, уведомления досят гаджет каждую секунду, подкрашивая весь документ 16-цатью регулярными выражениями, мы же уже говорили об этом и я пока не исправлял, не модифицировал.
2. Мы опять по разному понимаем что такое SCI_AUTOCSETMAXHEIGHT. Из слов сказанных выше я понимаю что ты говоришь о количестве строк автозавершения, то есть если у PureBasic 2000 функций, то ты выставляешь этот параметр 2000 чтобы все функции воспринимались редактором. Мой же посыл был что число указывает максимальное число пунктов без прокрутки. Например если указано 5, то когда появляется шестой пункт в списке будет отображаться 5 пунктов, а доступ к шестому пункту будет осуществляться прокручиванием списка полосой прокрутки справа. То есть список будет всегда высотой 5 пунктов, даже если в списке 5000 пунктов, просто остальные 4995 пунктов окажутся невидимы и надо крутить прокрутку. Если в списке будет 3 пункта, то понятно что список не будет высотой 5 пунктов, а высотой 3 пункта, когда наберётся больше 5 пунктов список станет высотой 5 пунктов и появится прокрутка. То есть высота списка после которого появляется прокрутка. У тебя экран не позволит показать 5000 пунктов, так как они не влезут в монитор физически, да и думаю Windows сама ограничит число пунктов высотой монитора и сама добавит прокрутку, хотя кто знает. То есть фактически при самых худших условиях - огромный монитор 1920x1080, где 1080 это высота, при самом мелком шрифте 8,5, у тебя масимум в монитор войдёт к примеру 60 пунктов. Грубо говоря если бы в Windows не было исправлений глупости программиста и он действительно создал бы 5000 пунктов без прокрутки, то ты бы никогда не увидел бы 4940 пунктов, так как они были бы за экраном и доступ к ним был бы невозможен, именно поэтому автор делает число пунктов не больше чем минимальный размер экрана 600 пиксель, где мы делим эти 600 пиксель на высоту шрифта и получаем число пунктов которые могут войти в монитор и ограничиваем число пунктов до указанного результата. Например шрифт 9 пунктов равен 12 пикселов в итоге 600/12=50 или 600/11=54 (при шрифте 8.5), в итоге если у тебя число пунктов будет более 54, то если у компа нет защиты от дурака, ты не увидишь пункты более 54. А значит кровь износу должен сделать мнеьше 54, так как если у меня плохое зрение и я поставил шрифт 12 (16пикселей) то у меня вмещается 37 пунктов и 54-37=17 пунктов я не увижу по вашей милости. Добавлено через 9 минут Кстати, ещё GoScintilla как источник готовых исходных кодов Scintilla
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 30.11.2022, 17:39 [ТС] | ||
|
Возможно, я не совсем понятно описал свой эксперимент. Я имел ввиду не монитор, а окно сцинтиллы. Просто я вписал в него 5000 строк. Строки могут быть любыми, главное, чтоб они нуждались в подсветке. Ты, вероятно, говоришь о том, что подсветка прорисовывается исключительно в видимой области редактора, и по мере его прокрутки невидимая область перестаёт отрисовываться, а появляющаяся в окне новая область, прежде не нуждающаяся в прорисовке, теперь должна быть отрисована, чтоб мы могли её созерцать в окне редактора ? Наверное, ты это имеешь ввиду ? Ну, как бы то ни было, пока в редакторе мало строк, они отрисовываются быстро, как только количество набранных в редакторе строк значительно возрастает, возрастает и время их обработки. При наличии, как в моём эксперименте, 5000 строк, работать в этом редакторе фактически невозможно. Отображение каждого вводимого символа приходится ждать от секунды и более, не говоря уже о введении нескольких символов подряд.
Придётся, видимо, мне надолго засесть в теорию и разные документации, чтобы разобраться и понять как правильно оптимизировать эту обработку и в чём реальная причина такой небыстрой прорисовки. Примеры у меня были в папке, но по нелепой случайности я их удалил, так что, благодарю за ссылку с примерами. Сейчас и их рассматривать буду. Возможно, там тоже что-нибудь нарою.
0
|
||
| 30.11.2022, 18:01 | |
|
antro735, SCI_SETIDLESTYLING отвечает подсветку всего документа или видимой области. Возможно можно на ходу переключать, например при открытии большого файла переключить флаг до того как он начнёт отображаться. Так как Scintilla перекрашивает строку, то самые тормознутые варианты, когда открывается html файл и весь его контент в одной строке и там при вводе символа это всё подвисает, несмотря что используется внутренний оптимизированный лексер. Кстати IDE PureBasic у меня были случаи, когда часть кода не подкрашивалась и начинаешь пытаться прокрутить, с Notepad++ такого нет.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 30.11.2022, 18:35 [ТС] | |
|
Да, Notepad++ работает достойно. Лично мне нужно сейчас взяться за изучение многих областей, чтобы разобраться. Придётся погрузиться в документации, справки и т.д. У меня реально недостаточно знаний и навыков, чтобы хотя бы сносно уметь разбираться в чужих кодах, понять ещё малоизвестные мне области, вроде модулей - я ещё не работал с ними и мало представляю их назначение, пользу и выгоду их применения. В том примере что у меня есть, они активно используются. Может, конечно, и не они тут играют главную скрипку, но освоение работы с модулями, думаю, тоже ещё пригодится.
0
|
|
|
|
|
| 30.11.2022, 19:19 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 30.11.2022, 19:27 [ТС] | |
|
В любом случае, есть какая-то выгода их использования, иначе, зачем бы они были нужны.
0
|
|
| 30.11.2022, 19:57 | |
|
antro735, выгода изолировать родственные функции в неком пространстве. Например подключил ты 6 инклудов и вдруг вылетает ошибка, что функция уже задекларирована. Автор одного иклуда не знал что автор другого инклуда будет использовать функцию с таким же именем. А если набор функций находится внутри модуля, то функция такая же, но в другом модуле, вызов же её происходит через имя модуля modul::func. По крайней мере максимум если ещё и имя модуля одинаковое, в этом случае поменять только имя модуля, а не править имена функций и вызовов внутри инклуда.
Можно импортировать имена UseModule то вместо modul::func можно сразу писать имя функции func. Можно легко переделать модуль в вариант без модуля, скопировав функции внутри, в общем убрать строки Module и EndModule ну и функции декларирования DeclareModule и EndDeclareModule. Внутри функции ничем не отличаются.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 30.11.2022, 23:24 [ТС] | |
|
AZJIO, вот здесь довольно неплохой пример редактора на Scintilla. Работает не уступая Notepad++ и редактору PureBasic
Может быть, тут можно понять принцип скорости его работы, но мне пока туго въехать полностью в его работу
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 02.12.2022, 17:39 [ТС] | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 02.12.2022, 18:55 [ТС] | |
|
0
|
|
|
|
|
| 02.12.2022, 19:43 | |
|
antro735, без регулярных выражений как здесь Работа с текстовым редактором Scintilla
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 02.12.2022, 20:13 [ТС] | |
|
locm, Может быть, и возможно без регулярных выражений быстро обрабатывать строки, но, тогда нужно будет либо дорабатывать и пересматривать существующий алгоритм, либо думать над другим, потому что в данном варианте, пока строк в редакторе мало, да, они обрабатываются быстро. Как только количество строк возрастает до 5 - 6 тысяч, работать в нём становится невозможно по причине слишком долгой обработки каждого вновь введённого символа. Вроде бы, казалось, он работает всего с одной строкой постоянно, но что за причина столь медленной работы с возрастанием общего количества строк в редакторе, пока не выяснено.
Ладно, буду ломать голову дальше как устранить этот недостаток.
0
|
|
| 03.12.2022, 07:21 | |
|
antro735, PureBasic удобнее подсветить библиотекой "/PureBasic/PureBasic 6.00 x86/SDK/Syntax Highlighting/SyntaxHighlighting.dll". Функции обратного вызова надо передать указатель на строку и длину. Библиотека будет выдавать позиции и длину элементов кода. С помощью математики указателей можно получить абсолютные позиции из относительных внутри строки.
На счёт рег.выр. иногда это проще, ведь если делать не регвыром, то это создавать тоже что регвыр но самому, разница в оптимизации, так как можно почти за один проход подсветить. Регвыр также посимвольно делает вычисления проверяя символы друг-за-другом. Тоже самое делаешь кодом, получил очередной символ, если это "#", то начинается константа, потом идут англ. символы до первого несоответствия, константа закончилась подсветил идёшь далее новая строка или приравнивание числа. Вот пример посимвольного обсчёта
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 03.12.2022, 08:24 [ТС] | ||
|
AZJIO, я понял. В любом случае идёт посимвольная проверка.
Я вот ещё что думаю... Заметил такую особенность компилятора. Работал как-то над одним алгоритмом, и чтобы иметь под рукой черновой и чистовой варианты, всё что уже работало нормально, копировал один-в-один в соседнюю вкладку. Чистовой вариант просто хранился в соседней вкладке, а в черновом продолжал работать дальше. Потом, на одном из этапов, скопировал нормально отработанный черновой материал в чистовик. Получилось две вкладки с АБСОЛЮТНО одинаковыми кодами-близнецами. Запускаю только что скопированную рабочую версию, и к своему удивлению вижу, что она работает некорректно. Запускаю ту вкладку, что рядом, и полностью тот же код, что и запускал только что. А она работает безошибочно и вполне корректно. Так несколько раз запускал одну и другую, и каждый раз одна и та же вкладка работала некорректно, а другая каждый раз без ошибок. Может быть кто сталкивался с таким явлением и этому есть объяснение ? Как такого избегать ? Наверное, особенности компилятора ? Возможно, и в этот раз я наступил на такие грабли и даже не догадываюсь об этом ?
0
|
||
| 03.12.2022, 11:07 | |
|
0
|
|
| 03.12.2022, 11:11 | |
|
antro735, опять вопросы всё обо всё в одной теме.
PureBasic предоставил эту библиотеку для разных задач, например подсветка кода в html, удаление комментариев, попытка удалить пробелы вокруг ключевых слов. А в IDE она наверно встроена. Если копируешь код с одной вкладки на вторую надо учитывать особенность, в конце кода скрытые комментарии настройки компилятора, их можно увидеть в AkelPad, который их не скрывает. Если в одном коде включен к пример "Безопасный поток" или "Запуск от админа", то вполне понятно что вкладка без этих комментариев принуждает код работать неправильно.
0
|
|
|
|
||
| 03.12.2022, 12:34 | ||
|
В меню Инструменты есть Сравнение файлов / папок. Какой результат сравнения?
0
|
||
| 03.12.2022, 12:34 | |
|
Помощь с текстовым редактором Ввод и вывод массива с текстовым редактором Обработка больших файлов текстовым редактором Сценарий PowerShell для работы с текстовым редактором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|