PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Marker (инструмент)


Marker (инструмент)

Сообщений 1 страница 7 из 7

1

Тема и исходник на оф.форуме
Заинтересовала идея как во многих редакторах подсветить выделенный текст, тем более что проба показала что это работает. Но в итоге столкнулся с тем что подсвечивает случайным образом, то есть как надо но не всё, а от начала до средины или меньше, каждый раз по разному, может вообще одно в начале подсветить, а может до 70% но никогда чтобы всё. Код уже рабочий, скомпилированный и проверенный как exe-файл, но тестить можно просто запуская с отладкой.
Может брать параметры (заголовок, класс окна, слово, путь), а может и без параметров работать через переменные (GetEnvironmentVariable). Я тестирую без параметров, в этом случае нет переменной пути ион берётся с заголовка, а если в заголовке не отображается путь, то берёт имя и ищет в списке путей (переменная PB_TOOL_FileList) нужный путь в котором есть имя файла из заголовка.
Сначала хотел сделать через SCI_SEARCHINTARGET непосредственно в окне Scintilla, но это не работало, как обычно проблема с функциями, которые работают с памятью и чужой процесс им недоступен, а значит помучившись забросил этот способ. И перешёл к способу открытия исходника как файла и поиск в нём и потом получая байтовую позицию для функции индикатора.
Так как индикатор выделяет в среднем 50% то можно сказать что проблемы позиций нет, так как пробовал SCI_GOTOPOS (закомментированная строк) и это стабильно перемещает по всем позициям в точности, остаётся только сбой функции индикатора. Задержку Delay() вставлял, не помогает. В общем идей больше нет, а инструмент вполне мог бы получится неплохой, внутри IDE он точно бы работал.

0

2

Получается, что код использует Scintilla ? Лишняя примочка.

0

3

Сделал как инструмент: скачать
видео как это работает.

https://www.upload.ee/image/17200669/Marker.png

Обновление
Добавлена кнопка "+" для добавления индикатора и параметр AutoAddIndic=1 для автоматического добавления при выборе нового цвета.
Добавлена кнопка выбора цвета
Добавлена кнопка "Далее", чтобы перемещаться по найденным элементам.
Ускорил поиск за счёт вычисления позиции не от начала каждый раз, а от предыдущего вхождения.

Отредактировано AZJIO (05.10.2024 01:50:58)

0

4

Честное слово: выглядит как попытка повторить VS Code.

0

5

Замабувараев написал(а):

Честное слово: выглядит как попытка повторить VS Code.

Пометки есть в любом редакторе AkelPad, Notepad++, RJ TextEd. Сам движок Scintilla поддерживает это программно. Когда VS Code в помине не было.

Кстати, плаг Highlight для Notepad++ я уже делал, почему бы тогда не сделать для PureBasic? Проблема что в плаге был прямой доступ. А тут вопрос, нужен ли такой плаг для PureBasic, нужно ли это делать инструментом. Было бы лучше сделать это внутри IDE поддерживаемым из коробки, минимум хотя бы отдельную кнопку "пометки" вместо "закрыть", а максимум отдельное окно с возможностью задать цвет.

Отредактировано AZJIO (06.10.2024 13:15:33)

0

6

Webarion
Использовал твой цикл, с задержкой было не то, прикинул 500 вхождений с задержкой от 10 мсек, получаем 5 секунд ожидания на пустом месте.
И ещё у тебя старая версия, в новой индикатор в списке indicatorList(), что позволяет подсвечивать разными цветами.

Отредактировано AZJIO (07.10.2024 18:44:18)

0

7

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)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Marker (инструмент)