Тема и исходник на оф.форуме
Заинтересовала идея как во многих редакторах подсветить выделенный текст, тем более что проба показала что это работает. Но в итоге столкнулся с тем что подсвечивает случайным образом, то есть как надо но не всё, а от начала до средины или меньше, каждый раз по разному, может вообще одно в начале подсветить, а может до 70% но никогда чтобы всё. Код уже рабочий, скомпилированный и проверенный как exe-файл, но тестить можно просто запуская с отладкой.
Может брать параметры (заголовок, класс окна, слово, путь), а может и без параметров работать через переменные (GetEnvironmentVariable). Я тестирую без параметров, в этом случае нет переменной пути ион берётся с заголовка, а если в заголовке не отображается путь, то берёт имя и ищет в списке путей (переменная PB_TOOL_FileList) нужный путь в котором есть имя файла из заголовка.
Сначала хотел сделать через SCI_SEARCHINTARGET непосредственно в окне Scintilla, но это не работало, как обычно проблема с функциями, которые работают с памятью и чужой процесс им недоступен, а значит помучившись забросил этот способ. И перешёл к способу открытия исходника как файла и поиск в нём и потом получая байтовую позицию для функции индикатора.
Так как индикатор выделяет в среднем 50% то можно сказать что проблемы позиций нет, так как пробовал SCI_GOTOPOS (закомментированная строк) и это стабильно перемещает по всем позициям в точности, остаётся только сбой функции индикатора. Задержку Delay() вставлял, не помогает. В общем идей больше нет, а инструмент вполне мог бы получится неплохой, внутри IDE он точно бы работал.
Marker (инструмент)
Сообщений 1 страница 7 из 7
Поделиться129.07.2024 23:34:38
Поделиться230.07.2024 13:24:32
Получается, что код использует Scintilla ? Лишняя примочка.
Поделиться304.10.2024 16:46:34
Сделал как инструмент: скачать
видео как это работает.
Обновление
Добавлена кнопка "+" для добавления индикатора и параметр AutoAddIndic=1 для автоматического добавления при выборе нового цвета.
Добавлена кнопка выбора цвета
Добавлена кнопка "Далее", чтобы перемещаться по найденным элементам.
Ускорил поиск за счёт вычисления позиции не от начала каждый раз, а от предыдущего вхождения.
Отредактировано AZJIO (05.10.2024 01:50:58)
Поделиться406.10.2024 04:27:57
Честное слово: выглядит как попытка повторить VS Code.
Поделиться506.10.2024 11:49:17
Честное слово: выглядит как попытка повторить VS Code.
Пометки есть в любом редакторе AkelPad, Notepad++, RJ TextEd. Сам движок Scintilla поддерживает это программно. Когда VS Code в помине не было.
Кстати, плаг Highlight для Notepad++ я уже делал, почему бы тогда не сделать для PureBasic? Проблема что в плаге был прямой доступ. А тут вопрос, нужен ли такой плаг для PureBasic, нужно ли это делать инструментом. Было бы лучше сделать это внутри IDE поддерживаемым из коробки, минимум хотя бы отдельную кнопку "пометки" вместо "закрыть", а максимум отдельное окно с возможностью задать цвет.
Отредактировано AZJIO (06.10.2024 13:15:33)
Поделиться607.10.2024 18:42:59
Webarion
Использовал твой цикл, с задержкой было не то, прикинул 500 вхождений с задержкой от 10 мсек, получаем 5 секунд ожидания на пустом месте.
И ещё у тебя старая версия, в новой индикатор в списке indicatorList(), что позволяет подсвечивать разными цветами.
Отредактировано AZJIO (07.10.2024 18:44:18)
Поделиться708.10.2024 10:03:38
Webarion
INDICATOR_MAX(43), раньше был INDIC_MAX (35)
Функция чтения данных у меня была, надо смотреть чем она отличается от твоей и вспоминать почему я отказался от неё.
Procedure.s GetScintillaText() Protected ReturnValue.s Protected length Protected buffer Protected processId Protected hProcess Protected result length = SendMessage_(ScintillaHandle, #SCI_GETLENGTH, 0, 0) If length length + 2 buffer = AllocateMemory(length) If buffer SendMessageTimeout_(ScintillaHandle, #SCI_GETCHARACTERPOINTER, 0, 0, #SMTO_ABORTIFHUNG, 2000, @result) If result GetWindowThreadProcessId_(ScintillaHandle, @processId) hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, processId) If hProcess ReadProcessMemory_(hProcess, result, buffer, length, 0) ReturnValue = PeekS(buffer, -1, #PB_UTF8) CloseHandle_(hProcess) ; <-- Axolotl, added acc. to MSDN EndIf EndIf EndIf FreeMemory(buffer) EndIf ProcedureReturn ReturnValue EndProcedure
На счёт остального надо посмотреть. У меня уже возникает желание создать полноценный как для Notepad++ я делал, поэтому пока не уверен. Я уже начал делать и уже сделал поменял ButtonImageGadget на ImageGadget, так как последний может обрабатывать правый клик, на левый сделал меню выбором готовых цветов, на правый клик вызов виндового, при этом хочу выбор виндового вставить в само меню пунктов. Но как сделать чтобы не конфликтовать с генерируемыми новыми цветами. Надо изначально системный подход, но для этого надо определиться оставить инструмент примитивным или сделать его полноценным с выбором стиля индикатора, с ini-файл где будет номер_индикатора_цвет, с регулировкой цвета в реальном времени. И при этом ещё желание вставить это в исходный код IDE создав в нём новый файл pb и встроить в меню, так как только в этом случае будет обеспечена поддержка в Linux. В общем пока не знаю как пойдёт, разве что для сегодняшнего момента подкорректировать исправность кода.
Я добавил в архив экспериментальный код с ПКМ, но если делать полноценный, то этот выбор был через комбо и все эти эксперименты бесполезны.
Отредактировано AZJIO (08.10.2024 11:23:50)
Похожие темы
PureBasic сборка | PureBasic для Windows | 16.03.2025 |
Миди синтезатор | PureBasic для Windows | 03.10.2021 |