PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » [IDE tool] comment toggle


[IDE tool] comment toggle

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

1

Новый инструмент, переключение комментария одной клавишей. Поддерживает многострочный текст.
Ссылка на код на оф.форуме.

При тесте проскакивает какой то глюк, пока не понял, он проскакивает если выделать многострочный русский текст. Причём специально проверяю и проблема исчезает... может между вставками сделать задержку?

Поставил мессаги как лог, чтобы посмотреть захваченный текст и обработанный.... и получил, что захваченный на 5-й раз оказался каким-то мусором.

Отредактировано AZJIO (13.03.2024 15:19:09)

0

2

AZJIO написал(а):

захваченный на 5-й раз оказался каким-то мусором.

Из документа Scintilla. https://www.scintilla.org/ScintillaDoc. … rectAccess

While faster, this direct calling will cause problems if performed from a different thread to the native thread of the Scintilla window in which case SendMessage(hSciWnd, SCI_*, wParam, lParam) should be used to synchronize with the window's thread.

Что переводится как

Несмотря на то, что этот прямой вызов быстрее, он вызовет проблемы, если он выполняется из потока, отличного от собственного потока окна Scintilla, и в этом случае его SendMessage(hSciWnd, SCI_*, wParam, lParam)следует использовать для синхронизации с потоком окна.

Предполагаю что память освобождается до или во время чтения функцией ReadProcessMemory() и тогда ее содержимое неопределенное, то есть мусор.

0

3

Пётр
Я пока сделал через #SCI_COPY, да это очередное засорение буфера обмена, но пока ни разу сбоя не было. Жаль выделение моргает, так как после вставки происходит восстановление. С захватом через память моргания не было.

Отредактировано AZJIO (13.03.2024 17:24:29)

0

4

Пётр
Могу ли я использовать такой приём, как это было использовано ранее в плаге на Notepad++?

Код:
PrototypeC ScintillaDirect(sciptr, msg, param1 = 0, param2 = 0)
Global Scintilla.ScintillaDirect=0


Procedure ScintillaMsg(*point, msg, param1 = 0, param2 = 0)
	If Scintilla And *point
    ProcedureReturn Scintilla(*point, msg, param1, param2)
	Else
    ProcedureReturn 0
	EndIf
EndProcedure

	
Scintilla = SendMessage_(ScintillaHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
MessageRequester("", Str(ScintillaMsg(ScintillaHandle, #SCI_LINEFROMPOSITION, pos1)))


	*sciptr = SendMessage_(ScintillaHandle, #SCI_GETDIRECTPOINTER, 0, 0)
	MessageRequester("", Str(ScintillaMsg(*sciptr, #SCI_LINEFROMPOSITION, pos1)))

Сейчас он вызвал ошибку в строке "Scintilla(*point......", и я его не совсем понимаю. Пытаясь искать знакомые слова:

мы вызываем SCI_GETDIRECTFUNCTION и помещаем его в переменную Scintilla, которая ранее объявлена как структура Scintilla.ScintillaDirect, при этом ScintillaDirect выше создан как прототип.
Далее вызывая ScintillaMsg проверяем, что Scintilla не ноль так как получен из вызова SCI_GETDIRECTFUNCTION и указатель *point получает хендл ScintillaHandle. Или тут надо @ScintillaHandle.

Если получить доступ к функциям Scintilla то я бы мог использовать #SCI_REPLACESEL и SCI_REPLACETARGET, которые недоступны через SendMessage

Отредактировано AZJIO (13.03.2024 17:20:22)

0

5

AZJIO написал(а):

как это было использовано ранее в плаге на Notepad++?

Плагин в виде dll?
Тогда он загружался в процесс Notepad++. Если это другой процесс, такой метод не сработает.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » [IDE tool] comment toggle