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

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

16.11.2022, 21:30. Показов 10040. Ответов 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
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
30.11.2022, 10:44
Студворк — интернет-сервис помощи студентам
antro735, SCI_AUTOCSETMAXHEIGHT это максимальная высота раскрывающегося списка без прокрутки, причём как я понимаю размер указывается в количестве пунктов, так как по умолчанию 5. Ну 5 пиксель точно быть не может, значит 5 пунктов, а я ещё по раскрывающемуся списку Windows помню, что там высота как раз таки указывается в количестве пунктов. Получается что максимальная высота умещающаяся на экран примерно 30, при условии что у меня шрифт 11 вместо стандартного 8,5 в Windows а высота монитора 1024. Каким образом ты умудряешься выставить 5000? У тебя монитор как 5-этажный дом?

Цитата Сообщение от antro735 Посмотреть сообщение
Не думаю, что чего-то не хватает в PureBasic-e
тогда как ты объяснишь, что в Notepad++ размер Scintilla.dll равен 1 Мб, а в PureBasic 0,4Мб?

Добавлено через 3 часа 6 минут
Попробуй внутренний лексер применить, расскажешь как он заработал.
https://www.purebasic.fr/engli... hp?t=32304
PureBasic
1
2
3
4
5
6
7
8
9
10
11
;lex setup 
ScintillaSendMessage(#SciGadget, #SCI_SETLEXER, #SCLEX_HTML, 0) 
ScintillaSendMessage(#SciGadget, #SCI_SETSTYLEBITS, 5, 0) 
 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_TAG, $FF) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_ATTRIBUTE, $FF00FF) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_ENTITY, $800000) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_COMMENT, $0FF00) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_DOUBLESTRING, $777777) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_SINGLESTRING, $0070FF) 
ScintillaSendMessage(#SciGadget, #SCI_STYLESETFORE, #SCE_H_NUMBER, $F00FF)
вставку кода поменяй там на
PureBasic
1
2
3
*a = UTF8("<IMG src='/images/image.jpg'> <A HREF='/test.php'>HELLO</A>")
ScintillaSendMessage(#Scintilla, #SCI_SETTEXT, 0, *a) ;Just put some text to see
FreeMemory(*a)
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
30.11.2022, 13:43  [ТС]
Цитата Сообщение от AZJIO Посмотреть сообщение
У тебя монитор как 5-этажный дом?
Нет, конечно. Я имел ввиду, что я брал первую попавшуюся на глаза строку, скопировал, и вписал её 5000 раз в испытуемый редактор каждый раз с новой строки. Просто, попалась под руку строка:

ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)

вот, её и вставлял в качестве экспериментального текста по принципу
PureBasic
1
2
3
4
5
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600)
Только здесь 4 строчки, а я пробовал с 5000. Тормозить стали и мой редактор, и My_Notepad_Sci (при условии, что в нём включен режим стиля pb).
Цитата Сообщение от AZJIO Посмотреть сообщение
Попробуй внутренний лексер применить, расскажешь как он заработал.
Не спорю, конечно, с внутренним лексером таких тормозов не будет. Но нам ведь нужно под свои стили, отличающиеся от нативных. Я ведь говорю, что проделал этот эксперимент так же с имеющимся у меня исходником редактора от какого-то зарубежного форума. Исходный код полностью написан на PureBasic без подключения каких-то доп. библиотек и т.п. Так же, присутствует текстовая подсветка (т.е. есть что подсвечивать). Подсветки не больше и не меньше, чем в моём редакторе и My_Notepad_Sci. Однако, именно он справился с задачей так же легко, как это сделал бы PureBasic или Notepad++. К слову, Notepad++ тоже был испытан и тоже с лёгкостью обрабатывал эти 5000 строк.

Я так понимаю, что можно обойтись имеющимися средствами PureBasic-а. Нужно только с правильной стороны подойти. В этом зарубежном исходном коде много модулей. Теперь, вот, сижу, изучаю тему модулей. Это тоже для меня ещё не освоенная область. Надо и с модулями научиться работать.

Хотел здесь выложить исходный код редактора с зарубежного форума, но не получается - слишком длинный.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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 строк, работать в этом редакторе фактически невозможно. Отображение каждого вводимого символа приходится ждать от секунды и более, не говоря уже о введении нескольких символов подряд.
Цитата Сообщение от AZJIO Посмотреть сообщение
У меня тормозит длиный код, потому что подсветка выполнена неправильно, уведомления досят гаджет каждую секунду, подкрашивая весь документ 16-цатью регулярными выражениями
Вот это, я думаю, и надо каким-то образом оптимизировать. Если у тебя хоть целыми регулярными выражениями анализирует, то в моём случае вообще посимвольно, что ещё больше тормозит весь процесс обработки строк.

Придётся, видимо, мне надолго засесть в теорию и разные документации, чтобы разобраться и понять как правильно оптимизировать эту обработку и в чём реальная причина такой небыстрой прорисовки. Примеры у меня были в папке, но по нелепой случайности я их удалил, так что, благодарю за ссылку с примерами. Сейчас и их рассматривать буду. Возможно, там тоже что-нибудь нарою.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
30.11.2022, 19:19
Модули это пространства имен.
Они изолируют участки кода.
На работу приложения не влияют.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
30.11.2022, 19:27  [ТС]
В любом случае, есть какая-то выгода их использования, иначе, зачем бы они были нужны.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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
Может быть, тут можно понять принцип скорости его работы, но мне пока туго въехать полностью в его работу
Вложения
Тип файла: rar Scintilla_Exemple.rar (23.7 Кб, 63 просмотров)
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
02.12.2022, 17:39  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Модули это пространства имен.
Они изолируют участки кода.
На работу приложения не влияют.
Тогда, если я размышляю в правильном направлении (поправьте меня, если ошибаюсь), то чтобы наилучшим образом оптимизировать скорость обработки вводимого текста или символов, лучше всего, делать это через регулярные выражения. То есть, любой вводимый объём символов обрабатывать регулярными выражениями, с той лишь разницей, что если вводимый объём в пределах одной строки, то обрабатывать как строку, если более одной строки, то весь этот объём от номера строки начала вставки текста, до номера строки его завершения целиком, но тоже с помощью регулярных выражений.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
02.12.2022, 18:32
Не совсем понял связь между модулями и регулярными выражениями.

Цитата Сообщение от antro735 Посмотреть сообщение
то чтобы наилучшим образом оптимизировать скорость обработки вводимого текста или символов, лучше всего, делать это через регулярные выражения
Не факт.
В PB IDE подсветка кодом и выполняется быстро.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
02.12.2022, 18:55  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
подсветка кодом
Немного не понял эту фразу.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
02.12.2022, 19:43
antro735, без регулярных выражений как здесь Работа с текстовым редактором Scintilla
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
02.12.2022, 20:13  [ТС]
locm, Может быть, и возможно без регулярных выражений быстро обрабатывать строки, но, тогда нужно будет либо дорабатывать и пересматривать существующий алгоритм, либо думать над другим, потому что в данном варианте, пока строк в редакторе мало, да, они обрабатываются быстро. Как только количество строк возрастает до 5 - 6 тысяч, работать в нём становится невозможно по причине слишком долгой обработки каждого вновь введённого символа. Вроде бы, казалось, он работает всего с одной строкой постоянно, но что за причина столь медленной работы с возрастанием общего количества строк в редакторе, пока не выяснено.

Ладно, буду ломать голову дальше как устранить этот недостаток.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
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, я понял. В любом случае идёт посимвольная проверка.
Цитата Сообщение от AZJIO Посмотреть сообщение
PureBasic удобнее подсветить библиотекой
Ты имел ввиду, что сам редактор PureBasic работает с этой библиотекой ?

Я вот ещё что думаю... Заметил такую особенность компилятора. Работал как-то над одним алгоритмом, и чтобы иметь под рукой черновой и чистовой варианты, всё что уже работало нормально, копировал один-в-один в соседнюю вкладку. Чистовой вариант просто хранился в соседней вкладке, а в черновом продолжал работать дальше. Потом, на одном из этапов, скопировал нормально отработанный черновой материал в чистовик. Получилось две вкладки с АБСОЛЮТНО одинаковыми кодами-близнецами. Запускаю только что скопированную рабочую версию, и к своему удивлению вижу, что она работает некорректно. Запускаю ту вкладку, что рядом, и полностью тот же код, что и запускал только что. А она работает безошибочно и вполне корректно. Так несколько раз запускал одну и другую, и каждый раз одна и та же вкладка работала некорректно, а другая каждый раз без ошибок. Может быть кто сталкивался с таким явлением и этому есть объяснение ? Как такого избегать ? Наверное, особенности компилятора ? Возможно, и в этот раз я наступил на такие грабли и даже не догадываюсь об этом ?
0
03.12.2022, 11:07

Не по теме:

Цитата Сообщение от antro735 Посмотреть сообщение
Как только количество строк возрастает до 5 - 6 тысяч
Ничего себе у вас файлы.

0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.12.2022, 11:11
antro735, опять вопросы всё обо всё в одной теме.
PureBasic предоставил эту библиотеку для разных задач, например подсветка кода в html, удаление комментариев, попытка удалить пробелы вокруг ключевых слов. А в IDE она наверно встроена.

Если копируешь код с одной вкладки на вторую надо учитывать особенность, в конце кода скрытые комментарии настройки компилятора, их можно увидеть в AkelPad, который их не скрывает. Если в одном коде включен к пример "Безопасный поток" или "Запуск от админа", то вполне понятно что вкладка без этих комментариев принуждает код работать неправильно.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
03.12.2022, 12:34
Цитата Сообщение от antro735 Посмотреть сообщение
Получилось две вкладки с АБСОЛЮТНО одинаковыми кодами-близнецами.
Точно одинаковые?
В меню Инструменты есть Сравнение файлов / папок.
Какой результат сравнения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2022, 12:34

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

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

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

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

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


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

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