Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124

Работа с текстовым редактором Scintilla

16.11.2022, 21:30. Показов 9033. Ответов 99
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток ! Тружусь над небольшой программкой, в которой у меня будет редактор кода на основе "Scintilla". Столкнулся с такой задачкой: нужно, чтобы при нахождении ключевого слова, происходила его замена. По типу как в пурике - если пользователь написал ключевое слово в нижнем регистре, редактор его заменил на то, как эти ключевые слова хранятся в программе. К примеру, пользователь прописал "for" -> редактор сменил на "For". При этом, пурик, как известно, подсветку производит непосредственно как только обнаруживает ключевое слово, а замену делает при наборе следующего символа. При этом, символ должен быть либо пробел, либо скобка, либо переход на новую строку и т.п.
Выкладываю свой самый сокращенный вариант для примера. В нём зарезервировано только одно ключевое слово "For", ну этого достаточно для теста. Тут я пытаюсь добиться желаемого, но как-то некорректно это происходит. В строчках 89, 90 как раз пытаюсь прописать эту замену, но почему-то она не работает как нужно.
Подскажите, пожалуйста, в чём ошибка ? Как только не пытался экспериментировать, никак не могу добиться желаемого. Документацию по Scintilla уже раз 40 пересматривал, изучал, но там тоже не так просто разобраться. Она таким тяжелым языком написана, а более понятной и доступной нигде не найти.
В общем, вот мой пример поиска решения, дальше которого я никак не могу продвинуться. Помогите, пожалуйста, если есть кто-то компетентный.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
InitScintilla("Scintilla.dll")
 
; Константы для подсветки синтаксиса
Enumeration 0
  #LexerState_Space
  #LexerState_Keyword
  #LexerState_FoldKeyword
EndEnumeration
 
Global ChangeWord$ = "For" ; слово для замены
 
Procedure MyLexerInit()
  ; Шрифт
  ScintillaSendMessage(0, #SCI_STYLESETFONT, #STYLE_DEFAULT, @"Lucida Console")
  ; Размер шрифта
  ScintillaSendMessage(0, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 10)
  ScintillaSendMessage(0, #SCI_STYLECLEARALL)
  
  ; Цвет активной строки
  ScintillaSendMessage(0, #SCI_SETCARETLINEBACK, RGB(254, 252, 202))
  ; Разрешаем отмачать активную строку
  ScintillaSendMessage(0, #SCI_SETCARETLINEVISIBLE, #True)
  
  ; Цвета подсветки синтаксиса
  ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Keyword, 0)  ; Обычный текст
  ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_FoldKeyword, $FF) ; Ключевые слова
  
  ; Поля 
  ScintillaSendMessage(0, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER) ; Поле автонумирации
  ScintillaSendMessage(0, #SCI_SETMARGINMASKN, 2, #SC_MASK_FOLDERS)  ; Поле свертки и маркеров
  ScintillaSendMessage(0, #SCI_SETMARGINWIDTHN, 0, 20)               ; Ширина поля автонумирации
  ScintillaSendMessage(0, #SCI_SETMARGINWIDTHN, 2, 20)               ; Ширина поля свертки и маркеров
  ScintillaSendMessage(0, #SCI_SETMARGINSENSITIVEN, 2, #True)
EndProcedure
 
Procedure SCI_EVENT(Gadget, *scinotify.SCNotification) ; Обработка событий от редактора
  code=             *scinotify.SCNotification\nmhdr\code
  pos=              *scinotify.SCNotification\Position
  ch=               *scinotify.SCNotification\ch
  modificationType= *scinotify.SCNotification\modifiers
  text=             *scinotify.SCNotification\text
  Length=           *scinotify.SCNotification\length
  linesAdded=       *scinotify.SCNotification\linesAdded
  message=          *scinotify.SCNotification\message
  wParam=           *scinotify.SCNotification\wParam
  lParam=           *scinotify.SCNotification\lParam
  line=             *scinotify.SCNotification\line
  foldLevelNow=     *scinotify.SCNotification\foldLevelNow
  foldLevelPrev=    *scinotify.SCNotification\foldLevelPrev
  margin=           *scinotify.SCNotification\margin
  listType=         *scinotify.SCNotification\listType
  x=                *scinotify.SCNotification\x
  y=                *scinotify.SCNotification\y
  
  
  Select code
    Case #SCN_STYLENEEDED
      EndPos = pos
      EndStyledPos = ScintillaSendMessage(0, #SCI_GETENDSTYLED)
      linenumber = ScintillaSendMessage(0, #SCI_LINEFROMPOSITION, EndStyledPos)
      
      ; Текуцая позиция курсора
      CurrentPos.l = ScintillaSendMessage(0, #SCI_POSITIONFROMLINE, linenumber)
      ; Подготовка к стилистической правке
      ScintillaSendMessage(0, #SCI_STARTSTYLING, CurrentPos)
      State = #LexerState_Space
      KeywordStartPos = CurrentPos
      keyword.s = ""
      
      While CurrentPos <= EndPos
        OldState = State
        
        Char.l = ScintillaSendMessage(0, #SCI_GETCHARAT, CurrentPos) ; Получаем символ из текущей позиции 
        If Char = 10 Or Char = 13 Or Char = 9 Or Char = ' '
          State = #LexerState_Space
        Else
          State = #LexerState_Keyword
          keyword + Chr(Char)
        EndIf
        
        If OldState <> State Or CurrentPos = EndPos
          If OldState = #LexerState_Keyword
            lkeyword.s = LCase(keyword)
            If lkeyword = "for"
              LenKeyword = Len(lkeyword)
              *Kwd = AllocateMemory(LenKeyword)
              PokeS(*Kwd, ChangeWord$, LenKeyword, #PB_UTF8)
              
              ScintillaSendMessage(0, #SCI_DELETERANGE, pos - LenKeyword, LenKeyword)
              ScintillaSendMessage(0, #SCI_INSERTTEXT, -1, *Kwd)
              ScintillaSendMessage(0, #SCI_GOTOPOS, pos)
              FreeMemory(*Kwd)
              
              OldState = #LexerState_FoldKeyword
            EndIf
            keyword = ""
          EndIf
          ScintillaSendMessage(0, #SCI_SETSTYLING, CurrentPos - KeywordStartPos, OldState) ; Подсветка синтаксиса
          KeywordStartPos = CurrentPos
        EndIf
        CurrentPos + 1
      Wend
      
  EndSelect
EndProcedure
 
If OpenWindow(0, 450, 200, 402, 402, "Scintilla Example", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
  ScintillaGadget(0, 2, 2, 398, 398, @SCI_EVENT())
  MyLexerInit()
  
  Repeat
    Event = WaitWindowEvent()
    
  Until Event = #PB_Event_CloseWindow
EndIf
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2022, 21:30
Ответы с готовыми решениями:

Работа с текстовым редактором
Доброе время суток!!! Помогите! пишу текстовый редактор, на основе ActionManager использовал стандартную кнопку Undo (вернуть, назад),...

Работа с текстовым редактором
Помогите пожалуйста доделать задание. Не понимаю как дальше сделать. Только начал изучать win form

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

99
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
28.11.2022, 10:21  [ТС]
Студворк — интернет-сервис помощи студентам
Я понял. Скорее всего, регулярными выражениями здесь не получится окрашивать фразы, если только отдельные символы, заключённые в одной регулярке. Одно выражение, состоящее из нескольких символов в разные цвета он не окрасит. А раз он этого не может сделать, то и не выполняется SCI_SETSTYLING, а следовательно непрерывно отправляются запросы на перерисовку. Насколько я понял, тут суть следующая - ввёл символ - вся строка начинает от первого символа до позиции Pos посимвольно окрашиваться пока не дойдёт до Pos. Если все перекрашивания удачны, запросы на раскрашивание прекращаются. Если какой-то символ не удалось покрасить - он снова отправляет запрос на перекрашивание. И может даже зависнуть. После каждого внесения изменений в строку, начинается посимвольная перекраска до позиции Pos

Добавлено через 10 минут
Если, к примеру, надо несколько символов сделать одним стилем, то только эта группа окрасится в один стиль, где начало и конец окраски задаёт
PureBasic
1
ScintillaSendMessage(#Scintilla_Gadget, #SCI_SETSTYLING, CurrentPos - KeywordStartPos, OldState)
Но это будет один стиль для этого диапазона. Дальше диапазон может быть в один символ, и он будет окрашен в какой-то стиль с началом и концом окрашивания в единицу, дальше снова может пойти группа символов, Ну, да, можно этот набор символов и в регулярку заключить, и как элемент массива, и как кусок из строки, тут дело личное - кому как удобно, но и эту группу символов, где есть начало и конец диапазона, он покрасит только в один цвет. и т.д., пока не достигнет Pos.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
28.11.2022, 10:26
Я тоже понял, что событие требует покраски хотя бы одного символа, ведь он же введён, то есть после каждого уведомления должен сработать SCI_SETSTYLING не меньше одного раза, который выдаст флаг, что операция покраски завершена, а пока флаг не переключился он так и будет слать уведомление о перекрашивании.

Ты ошибаешься, несмотря на то что регвыр красит поверх при умении можно сделать нормальное подкрашивание. У меня даже код PureBasic подкрашивается. Я уже сделал регвыр наверно для 7 файлов.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
28.11.2022, 10:37  [ТС]
Ты ошибаешься, несмотря на то что регвыр красит поверх при умении можно сделать нормальное подкрашивание.
Ну, тут да, я могу ошибаться. Но то что цикл While перебирает строку посимвольно - мы это понимаем. Другое дело - в каком-то месте можно сказать ему: "А вот в этом месте покрась мне не один символ, а вернись назад до позиции икс, и от неё до этого места покрась все символы в серо-буро-малиновый в крапинку с рыжей полоской" образно - он это сделает, и будет двигаться дальше. Главное, чтоб неокрашенных символов не оставалось позади.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
28.11.2022, 11:34
antro735, пустышку ей на покраску отправить, например позиция 345 длина 0. Надо проверить, скормится ли он этим. Гугли "My_Notepad_Sci" для посмотреть.
0
Эксперт по электронике
6872 / 3295 / 340
Регистрация: 28.10.2011
Сообщений: 12,912
Записей в блоге: 7
28.11.2022, 11:57
Цитата Сообщение от AZJIO Посмотреть сообщение
И мне было не понятно "GET END STYLED", а где же "GET START STYLED"? Это работает от начала текста?
https://www.scintilla.org/Scin... TYLENEEDED
SCN_STYLENEEDED
If you used SCI_SETILEXER(NULL) to make the container act as the lexer, you will receive this notification when Scintilla is about to display or print text that requires styling. You are required to style the text from the line that contains the position returned by SCI_GETENDSTYLED up to the position passed in SCNotification.position. Symbolically, you need code of the form:
startPos = SCI_GETENDSTYLED()
lineNumber = SCI_LINEFROMPOSITION(startPos);
startPos = SCI_POSITIONFROMLINE(lineNumber);
MyStyleRoutine(startPos, SCNotification.position);
Перевод на русский
Вы должны стилизовать текст от строки, содержащей позицию, возвращенную SCI_GETENDSTYLED, до позиции, переданной в SCNotification.position.
Цитата Сообщение от AZJIO Посмотреть сообщение
Пока тестировал используя Debug для #SCI_GETENDSTYLED, обнаружил, что у меня события #SCN_STYLENEEDED высылаются каждую секунду вне зависимости ввожу я текст или нет.
Курсор мигает.
Из-за него эти события.

Цитата Сообщение от AZJIO Посмотреть сообщение
Естественно не хочется чтобы файл размером 200 кб каждую секунду пытался подкрашиваться 16-надцатью регулярными выражениями.
Не нужно красить весь текст в редакторе. В событии #SCN_STYLENEEDED редактор сообщает откуда и докуда красить.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
28.11.2022, 12:38  [ТС]
Залил себе. Открыл, помотрел. Самое интересное знаешь в чём Редактор, над которым сейчас тружусь я, тоже с практически такой же тёмной темой Правда, я ещё предоставил возможность переключаться темам - светлая и тёмная. Ты его чисто для себя писал ? для своих нужд и удобства ?

Добавлено через 10 минут
Курсор мигает.
Из-за него эти события.
Странно, а почему тогда это событие не отсылается в том последнем коде, где уже корректная замена ключевого слова. После ввода любого символа один раз дебаг срабатывает. А если что-то идёт не так, тогда да, дебаг каждую секунду выдаёт строку. И когда это происходит, проявляются разные баги при работе в редакторе.

Добавлено через 24 минуты
И ещё... Я сейчас приступил к индикаторной подсветке выделенного слова в тексте. Ну, как в пурике - выделил слово, и по всему тексту где оно встречается, оно подсвечено индикатором. Но тут столкнулся с непонятным явлением. Не знаю, это или у меня пурик глючит, или что-то другое. В общем, мне нужно добавить символ "$" в стандартный набор символов слова. Там это делается через указатель на эту строку. Так вот, если у меня строка короткая, то всё нормально. Например:
PureBasic
1
2
3
4
#CHARS_WORD = "abcde"
*SelWd = AllocateMemory(Len(#CHARS_WORD) + 1)
PokeS(*SelWd, #CHARS_WORD)
FreeMemory(*SelWd)
Стоит увеличить длину строки, и выскакивает ошибка в четвертой строке при очистке памяти:
"Невозможен доступ к памяти(ошибка чтения по адресу 548.......)"
Вот тут уже выдаёт постоянно эту ошибку:
PureBasic
1
2
3
4
#CHARS_WORD = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
*SelWd = AllocateMemory(Len(#CHARS_WORD) + 1)
PokeS(*SelWd, #CHARS_WORD)
FreeMemory(*SelWd)
В чём причина, не пойму. Это только у меня так ?
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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
Эксперт по электронике
6872 / 3295 / 340
Регистрация: 28.10.2011
Сообщений: 12,912
Записей в блоге: 7
28.11.2022, 17:30
Цитата Сообщение от antro735 Посмотреть сообщение
Стоит увеличить длину строки, и выскакивает ошибка
В формате юникода каждый символ занимает 2 байта, а Len() возвращает число символов, а не байт.
PureBasic
1
2
3
4
#CHARS_WORD = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
*SelWd = AllocateMemory(StringByteLength(#CHARS_WORD, #PB_Unicode) + 2)
PokeS(*SelWd, #CHARS_WORD)
FreeMemory(*SelWd)
Чтобы точнее находить такие ошибки, нужно в настройках компилятора на вкладке "Компиляция/Запуск" включить Purifier.
PureBasic
1
2
3
4
5
6
PurifierGranularity(1, 1, 1, 1)
 
#CHARS_WORD = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
*SelWd = AllocateMemory(Len(#CHARS_WORD) + 1)
PokeS(*SelWd, #CHARS_WORD)
FreeMemory(*SelWd)
Если необходим указатель на строку, проще его напрямую получить
PureBasic
1
2
s.s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
*SelWd = @s
PureBasic
1
*SelWd = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
Это при условии если в строку не нужно ничего записывать, т. е. только чтение.
1
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
28.11.2022, 18:49  [ТС]
Благодарю, locm ! Не перестаю удивляться - это же какой объём информации и знаний должно находиться в голове, чтобы так хорошо ориентироваться и знать столько тонкостей !!!? Включил Purifier. Сейчас в протоколе ошибок фиксирует ошибку по-другому, пишет: "overflow in a dynamically allocated memory block". То есть, "переполнение в динамически выделяемом блоке памяти", вместо "ошибка чтения по адресу .....", а это уже конкретная причина сбоя исполнения программы. Чтобы точно убедиться, что я правильно понял Вашу подсказку, Purifier так и работает и я верно сделал настройку ?

Добавлено через 13 минут
Сообщение от locm
Это при условии если в строку не нужно ничего записывать, т. е. только чтение.
В документации к Scintilla список символов категории слов корректируется через сообщение:

SCI_SETWORDCHARS(<unused> , const char *characters)
Это сообщение определяет, какие символы являются членами категории слов. Перед обработкой этой функции категории символов устанавливаются значения по умолчанию. Например, если вы не разрешаете '_' в вашем наборе символов использовать:
SCI_SETWORDCHARS (0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM NOPQRSTUVWXYZ0123456789") ;

Вот тут я ещё не знаю, const char *characters - как правильно понимать ? Имеется ввиду заполненная область памяти, или достаточно указателя на строку ?
0
Эксперт по электронике
6872 / 3295 / 340
Регистрация: 28.10.2011
Сообщений: 12,912
Записей в блоге: 7
28.11.2022, 19:39
Цитата Сообщение от antro735 Посмотреть сообщение
Purifier так и работает и я верно сделал настройку ?
Да, так и работает. Он сообщает при записи за пределами доступной области что позволяет проще и быстрее найти место ошибки.

Цитата Сообщение от antro735 Посмотреть сообщение
Вот тут я ещё не знаю, const char *characters - как правильно понимать ?
Это константный указатель на строку.
По сути это
PureBasic
1
ScintillaSendMessage(#Scintilla_Gadget, #SCI_SETWORDCHARS, 0, @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ0123456789")
Точно не знаю насчет именно этого сообщения, но Scintilla работает с текстом в кодировке UTF-8, а не в юникоде.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
28.11.2022, 19:59  [ТС]
Сообщение от locm

Это константный указатель на строку.
Понял. Благодарю за ещё один плюсик в мою копилку знаний. Поработаю с этими указателями, адресами и метками. Мне нужно разобраться с этой областью....
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
29.11.2022, 11:24
Посмотри ссылки плаги Notepad++, код-архив (в последней папке есть Scintilla и ещё найди там автора eddy в его папке примеры Scintilla и ссылки на оригиналы)
1
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
29.11.2022, 15:42  [ТС]
Благодарю, AZJIO ! Я тем временем с подсветкой одинаковых слов в тексте закончил, за автозавершение взялся.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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.

Цитата Сообщение от AZJIO Посмотреть сообщение
Scintilla может быть скомпилирована с лексерами и без, видимо вариант в PureBasic скомпилирован без лексеров, а также без поддержки SCFIND_CXX11REGEX
Не думаю, что чего-то не хватает в PureBasic-e, потому что у меня есть пример кода, в котором нет той проблемы, которую я обнаружил у себя в результате одного эксперимента. Кстати, попробовал это сделать в My_Notepad_Sci, та же проблема. Эксперимент такой - ввожу в экспериментируемый редактор 5000 строк:
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
просто посмотреть как он с ними будет справляться. И тут начинаются нереально жуткие тормоза - что у меня, что в My_Notepad_Sci.
Однако, этого не наблюдается в том редакторе, пример которого у меня есть. И написан он тоже на PureBasic. Никаких тормозов. Правда, там почти 2500 строк кода, много разных модулей. Моего уровня пока не хватает, чтоб разобраться в том исходнике. Что-то я там понимаю, но далеко не всё. Могу выложить сюда исходник, только, не знаю, можно ли такой длинный код здесь выкладывать ? Не забанят ?

Добавлено через 5 минут
В My_Notepad_Sc начинаются тормоза когда включаешь его в режим подсветки pb
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2022, 04:50
Помогаю со студенческими работами здесь

С текстовым редактором C++ Builder
Всем привет, нужна ваша помощь. Делаю текстовый редактор, окно сохранить, открыть файл уже готовы. Вопрос следующий. Как сделать так,...

Помощь с текстовым редактором
ребят нужна помощь!) нужно в текстовом редакторе сделать правописание жи-ши , т.е. пишим ЖЫ или Шы он должен подчекнуть и исправить по...

Ввод и вывод массива с текстовым редактором
Ребят помогите срочно нужно сделать так чтобы считывался массив с in.txt и отправлялся полученный результат в out.txt {$R+} uses crt; ...

Обработка больших файлов текстовым редактором
У меня задание написать текстовый редактор, в целом всё ясно, за исключение пункта: &quot;возможность обработки больших файлов&quot;. Я не...

Сценарий PowerShell для работы с текстовым редактором
Доброго времени суток!!! Очень нуждаюсь в вашей помощи! Начали изучать в университете новый предмет, лекции читают про то как работают ОС,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из 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 - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru