purebasic.info

PureBasic forum
Текущее время: Вс окт 21, 2018 8:05 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: плагин подсветки для Notepad++
СообщениеДобавлено: Сб июн 09, 2018 3:14 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
При поиске инфы по Notepad++ нашёл пример плагина
Давно эта идея меня посещала, написать плагин, но к примеру с помощью AutoIt3 максимум можно создать внешнее окно для управления Scintilla.

Несколько раз я пытался сделать запрос функций на подсветку с помощью регулярных выражений (ссылка), пока безрезультатно.

Здесь я увидел как человек это выполнил на питоне.

В принципе не буду кидать сюда ссылки всего что я нашёл в гугле, думаю их можно найти, но они меня не привели к решению. Здесь я посмотрел команды Scintilla на подсветку. В справке PureBasic я нашёл как встроить Scintilla и выслать ему команды. Вроде осталось связать воедино, но пока не получается. На официальном сайте вроде много ссылок где пытаются выслать команды Notepad++, чтобы подсветить, но пока решения я не нашёл, там либо на С++ либо ещё что отвлечённое.

Нужно в процедуру Test (верхняя ссылки на пример) вставить что-то в виде ScintillaSendMessage с дескриптором элемента Scintilla Notepad++ выслав команду INDIC_TEXTFORE указав позицию текста и длину. Но перед этим надо будет ещё сделать поисковой движок с помощью регулярных выражений, чтобы в окне задать что искать, он бы выдал позицию и уже используя эти данные выслать команду подсветки.

Решение

Highlight12.zip
sampo.ru
rgho.st
Добавил регулировку цвета.
Изображение
Добавил AutoIt3 и комментарии в рег.выр.


Вложения:
Highlight12.zip [219.93 KiB]
Скачиваний: 14


Последний раз редактировалось AZJIO Чт авг 09, 2018 2:52 pm, всего редактировалось 11 раз(а).
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Сб июн 09, 2018 6:29 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6384
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Искать лучше по SCI_SETSTYLING
На нашем форуме давно было, например
viewtopic.php?f=1&t=1620&start=0
viewtopic.php?f=1&t=4567&view=previous

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Сб июн 09, 2018 10:45 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Еще несколько ссылок.
viewtopic.php?f=1&t=4668
viewtopic.php?f=5&t=1011
viewtopic.php?f=1&t=236

Когда-то давно написал редактор. http://pure-basic.narod.ru/project/PicAsmEditor.html

AZJIO писал(а):
Нужно в процедуру Test (верхняя ссылки на пример) вставить что-то в виде ScintillaSendMessage с дескриптором элемента Scintilla Notepad++ выслав команду INDIC_TEXTFORE указав позицию текста и длину.
Как работать с Scintilla без функции ScintillaSendMessage (точнее с ее аналогом) показано в этом коде. viewtopic.php?p=86979#p86979
Если кратко, из Scintilla.dll экспортируется функция Scintilla_DirectFunction и именно она служит основой для ScintillaSendMessage.
Код:
1
2
Prototype.l ScintillaDirect(sciptr.l, msg.l, param1.l = 0, param2.l = 0)
Global Scintilla.ScintillaDirect=GetFunction(0, "Scintilla_DirectFunction")

Нужно узнать хендл редактора Scintilla в Notepad++ и отправить сообщение #SCI_GETDIRECTPOINTER.
Код:
1
sciptr = SendMessage_(scihWnd, #SCI_GETDIRECTPOINTER, 0, 0) ; хендл окна скинтиллы

Чтобы получить указатель который потом следует передавать в первом аргументе функции Scintilla_DirectFunction.

В плагине есть функция.
Код:
1
2
3
4
5
6
ProcedureCDLL beNotified(*SCNotification.SCNotification)
   ;
   ;<< When Notepad++ scintilla notification has been received >>
   ; YOUR CODE HERE  
   ;
EndProcedure

В ней нужно производить подсветку синтаксиса.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Вт июн 12, 2018 5:40 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Мне пока трудно ориентироваться, вот что я перевёл на русский язык
Код:
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
116
117
118
119
120
121
122
;unicode - DLL - compiler x86
 
Structure NppData
   *_nppHandle
   *_scintillaMainHandle
   *_scintillaSecondHandle
EndStructure                
 
Structure ShortcutKey
   _isCtrl.b
   _isAlt.b
   _isShift.b
   _key.i
EndStructure
 
Structure FuncItem Align 4
   _itemName.s{64}
   *_pFunc
   _cmdID.i
   _init2Check.b
   *_pShortcutKey.ShortcutKey
EndStructure
 
; ==================================
; 2 Обязательные процедуры DLL
; ==================================
Declare Test()
 
ProcedureDLL AttachProcess(Instance)
   ;
   ;<< Когда Notepad++ установил этот плагин >>
   ; Ваш код инициализации здесь
   ;
   Global NppData.NppData
   Global PluginName.s="Highlight Color"
   Global Dim FuncsArray.FuncItem(4)   ; меню с 4 пунктами
   With FuncsArray(0)                  ;1) пункт меню с быстрой клавишой
      \_itemName="Подсветить текст"
      \_pFunc=@test()
      \_pShortcutKey=AllocateStructure(ShortcutKey)
      \_pShortcutKey\_isCtrl=#True
      \_pShortcutKey\_isShift=#True
      \_pShortcutKey\_isAlt=#True
      \_pShortcutKey\_key=#VK_NEXT
   EndWith                             ;2) разделитель в меню
   With FuncsArray(1)
      \_itemName=""
   EndWith
   With FuncsArray(2)                  ;3) пункт меню - чекбокс с галкой
      \_itemName="Option 1"
      \_pFunc=@Test()
      \_init2Check=#True
   EndWith
   With FuncsArray(3)                  ;4) пункт меню - чекбокс без галки
      \_itemName="Option 2"
      \_pFunc=@Test()
      \_init2Check=#False
   EndWith
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
   ;
   ;<< Когда Notepad++ удаляет этот плагин >>
   ; Ваш код очистки здесь
   ;
   Protected i
   For i=0 To ArraySize(FuncsArray())
      FreeStructure(FuncsArray(i)\_pShortcutKey)
   Next
EndProcedure
 
; ==================================
; 5 Обязательные процедуры NOTEPAD++
; ==================================
 
; видимо NPP спрашивает, является ли плагин в юникоде, возвращаем "ДА"
ProcedureCDLL.i isUnicode()
   ProcedureReturn #True
EndProcedure
 
; видимо NPP спрашивает имя плагина
ProcedureCDLL.s getName()
   ProcedureReturn PluginName
EndProcedure
 
; видимо NPP спрашивает, элементы меню, чтобы встроить их в меню "Плагины"
ProcedureCDLL.i getFuncsArray(*FuncsArraySize.Integer)
   *FuncsArraySize\i=ArraySize(FuncsArray())
   ProcedureReturn @FuncsArray()
EndProcedure
 
ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
   NppData\_nppHandle=*NppHandle
   NppData\_scintillaMainHandle=*ScintillaMainHandle
   NppData\_scintillaSecondHandle=*ScintillaSecondHandle
   ;
   ;<< Когда инфа Notepad++ изменилась >>
   ; Ваш код здесь
   ;
EndProcedure
 
ProcedureCDLL beNotified(*SCNotification.SCNotification)
   ;
   ;<< Когда было получено уведомление scintilla Notepad++ >>
   ; Ваш код здесь
   ;
EndProcedure
 
ProcedureCDLL.i messageProc(Message, wParam, lParam)
   ;
   ;<< Когда было получено windows-сообщение Notepad++ >>
   ; Ваш код здесь
   ;
   ProcedureReturn #True
EndProcedure
 
; ==================================
; Ваши процедуры плагина
; ==================================
Procedure Test()
   MessageRequester("Плаг для notepad++ написанный на PureBasic", "Проверка...")
EndProcedure



Пётр писал(а):
В ней нужно производить подсветку синтаксиса.
я думаю это если я делаю подсветку в фоновом режиме, типа ввёл символ, получил уведомление, так как содержимое изменилось, процедура выполнилась и снова подсветила с учётом новых данных. Но я хочу произвести разовую подсветку, ну может не одним регулярным выражением и не одним цветом, но разовую. А значит мне пока нужна функция Test.

Пётр писал(а):
Как работать с Scintilla без функции ScintillaSendMessage (точнее с ее аналогом) показано в этом коде.
там изначально создаётся окно внутри программы и хендл она возвращает. В представленном плагине есть текст обязательные процедуры, там есть setInfo, и там похоже сам Notepad++ предоставляет скрипту все необходимые хендлы. да и логически глупо было бы получать их методом поиска окна, так как этот метод костыля, а правильный прога должна плагину дать всё что нужно.

На всякий случай я в той теме тоже задал вопрос, автор eddy слишком много выложил скриптов по теме Scintilla, наверняка ему легко дать готовый пример.

Выдал он мне цифры
Код:
1
2
3
4
5
6
7
8
9
10
Procedure Test()
        Protected Result$
        Result$ + Str(NppData\_nppHandle) + #CRLF$
        Result$ + Str(NppData\_scintillaMainHandle) + #CRLF$
        Result$ + StrD(NppData\_nppHandle) + #CRLF$
        Result$ + StrD(NppData\_scintillaMainHandle) + #CRLF$
        Result$ + StrU(NppData\_nppHandle) + #CRLF$
        Result$ + StrU(NppData\_scintillaMainHandle) + #CRLF$
        MessageRequester("Плаг для notepad++ написанный на PureBasic", Result$)
EndProcedure



Вложения:
eddy.zip [8.13 KiB]
Скачиваний: 23
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Вт июн 12, 2018 10:27 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AZJIO писал(а):
я думаю это если я делаю подсветку в фоновом режиме, типа ввёл символ, получил уведомление
Scintilla работает не так. Редактор сообщает с какой позиции по какую нужно произвести подсветку. Например если видно лишь часть текста, то зачем подсвечивать весь? По мере прокрутки, отправляются новые сообщения с позициями которые нужно подсветить.
Однократная подсветка имеет смысл для не очень длинного текста и в режиме "только чтение".

AZJIO писал(а):
А значит мне пока нужна функция Test.
Она вызывается при клике по пункту меню.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Вт июн 12, 2018 1:59 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Пётр писал(а):
Например если видно лишь часть текста, то зачем подсвечивать весь?
Если бы он подсвечивал только видимое, то при быстрой прокрутке не успевал бы, да и есть инструмент "Карта", который показывает весь код подсвеченным на карте. И открывает большие файлы например txt открывает мгновенно, а html тормозит в момент открытия, а потом прокручивается мгновенно. Если бы видимое обрабатывал, то открывался бы также быстро, а прокрутка бы тормозила. Но такую фичу подгрузки текста я наблюдал у шестнадцатеричных редакторов, они могут диск открыть и прокрутить мгновенно в любое место.

Пётр писал(а):
Однократная подсветка имеет смысл для не очень длинного текста и в режиме "только чтение"
В Notepad++ есть инструмент "Пометить", там выполняется однократное выделение некоторого текста. А ещё есть применение 5-ти стилей подсветки разным цветом. Но во первых в 5 стилях есть только пометка выделенного, в "Пометки" можно использовать рег.выр. но помечать одним цветом. Встроенный UDL не даёт гибко подсвечивать, а иногда надо ещё и извращаться, придумывать костыли. Если сделать поддержку применения нескольких рег.выр, то получится конфетка, свобода творчества. Можно через такой движок подсвечивать языки программирования. Может это будет не оптимизировано, но это если открыть файлы до 3 Мб, а они часто копейки весят. Да и рег.выр если правильно написать он работать будет быстрее текстовых функций.
Ну и в итоге никто не мешает поэкспериментировать на подсветке в другой функции, реагирующей на изменение текста.

Я кстати попробовал вставить строки выше сказанные, ничего не работает пока, да и я не понимаю их.
наверху вставил это:
Код:
1
2
3
#SCI_SETTEXT = 2181
Prototype.l ScintillaDirect(sciptr.l, msg.l, param1.l = 0, param2.l = 0)
Global Scintilla.ScintillaDirect=GetFunction(0, "Scintilla_DirectFunction")


низу это (в функцию Test)
Код:
1
2
3
4
        sciptr = NppData\_scintillaMainHandle
;       sciptr = SendMessage_(sciptr, #SCI_GETDIRECTPOINTER, 0, 0);хендл окна скинтиллы
        text.s = "Привет всем, как дела!"
        Scintilla(sciptr, #SCI_SETTEXT, 0, @text)


пока выдаёт ошибку
Код:
1
2
3
4
5
6
7
---------------------------
PluginsManager::runPluginCommand Exception
---------------------------
Access violation
---------------------------
ОК  
---------------------------



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Вт июн 12, 2018 3:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AZJIO писал(а):
пока выдаёт ошибку
В NppData\_scintillaMainHandle ноль.
Код:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
;unicode - DLL - compiler x86
 
Structure NppData Align #PB_Structure_AlignC
   *_nppHandle
   *_scintillaMainHandle
   *_scintillaSecondHandle
EndStructure                
 
Structure ShortcutKey Align #PB_Structure_AlignC
   _isCtrl.b
   _isAlt.b
   _isShift.b
   _key.u ;i
EndStructure
 
Structure FuncItem Align #PB_Structure_AlignC
   _itemName.s{64}
   *_pFunc
   _cmdID.i
   _init2Check.b
   *_pShortcutKey.ShortcutKey
EndStructure
 
; ==================================
; 2 MANDATORY DLL PROCEDURES
; ==================================
Declare Test()
 
Prototype ScintillaDirect(sciptr, msg, param1 = 0, param2 = 0)
 
 
CompilerIf #PB_Compiler_LineNumbering=0
  CompilerError "Включите в настройках компилятора поддержку OnError"
CompilerEndIf
 
Procedure FatalError()
   Protected Result.s
   
   Result="Ошибка программы"
 
   CompilerIf #PB_Compiler_LineNumbering
     Result+" в строке "+ErrorLine()+", файла: "+GetFilePart(ErrorFile())
   CompilerEndIf
   
   Result+Chr(10)+Chr(10)+"Ошибка типа: "+Chr(34)+ErrorMessage()+Chr(34)
   MessageRequester("Ошибка программы!", Result, #MB_OK|#MB_ICONERROR)
 EndProcedure
 
 
ProcedureDLL AttachProcess(Instance)
   ;
   ;<< When Notepad++ is installing this plugin >>
   ; YOUR INIT CODE HERE
 
  OnErrorCall(@FatalError())
 
  If OpenLibrary(0, "Scintilla.dll")=0
    If OpenLibrary(0, "..\Scintilla.dll")=0
      If OpenLibrary(0, "SciLexer.dll")=0
        OpenLibrary(0, "..\SciLexer.dll")
      EndIf
    EndIf
  EndIf
   
  Global Scintilla.ScintillaDirect=0
 
  If IsLibrary(0)
    Scintilla = GetFunction(0, "Scintilla_DirectFunction")
  EndIf
   ;
   Global NppData.NppData
   Global PluginName.s="My Custom Plugin Name"
   Global Dim FuncsArray.FuncItem(1)   ;menu with 4 items
   With FuncsArray(0)                  ;1) menu item with shortcut key
      \_itemName="Settings..."
      \_pFunc=@test()
      \_pShortcutKey=AllocateStructure(ShortcutKey)
      \_pShortcutKey\_isCtrl=#True
      \_pShortcutKey\_isShift=#True
      \_pShortcutKey\_isAlt=#True
      \_pShortcutKey\_key=#VK_NEXT
   EndWith                             ;2) menu separator
;    With FuncsArray(1)
;       \_itemName=""
;    EndWith
;    With FuncsArray(2)                  ;3) menu item with checked box
;       \_itemName="Custom Option 1"
;       \_pFunc=@Test()
;       \_init2Check=#True
;    EndWith
;    With FuncsArray(3)                  ;4) menu item with unchecked box
;       \_itemName="Custom Option 2"
;       \_pFunc=@Test()
;       \_init2Check=#False
;    EndWith
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
   ;
   ;<< When Notepad++ is uninstalling this plugin >>
   ; YOUR CLEANUP CODE HERE
   ;
   Protected i
   For i=0 To ArraySize(FuncsArray())
      FreeStructure(FuncsArray(i)\_pShortcutKey)
   Next
EndProcedure
 
; ==================================
; 5 MANDATORY NOTEPAD++ PROCEDURES
; ==================================
 
ProcedureCDLL.i isUnicode()
   ProcedureReturn #PB_Compiler_Unicode
EndProcedure
 
ProcedureCDLL.s getName()
   ProcedureReturn PluginName
EndProcedure
 
ProcedureCDLL.i getFuncsArray(*FuncsArraySize.Integer)
   *FuncsArraySize\i=ArraySize(FuncsArray())
   ProcedureReturn @FuncsArray()
EndProcedure
 
ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
   NppData\_nppHandle=*NppHandle
   NppData\_scintillaMainHandle=*ScintillaMainHandle
   NppData\_scintillaSecondHandle=*ScintillaSecondHandle
   ;
   ;<< When Notepad++ info has changed >>
   ; YOUR CODE HERE
   ;
   MessageRequester("PB Plugin for notepad++", ""+NppData\_scintillaMainHandle)
EndProcedure
 
ProcedureCDLL beNotified(*SCNotification.SCNotification)
   ;
   ;<< When Notepad++ scintilla notification has been received >>
   ; YOUR CODE HERE  
   ;
EndProcedure
 
ProcedureCDLL.i messageProc(Message, wParam, lParam)
   ;
   ;<< When Notepad++ windows message has been received >>
   ; YOUR CODE HERE
   ;
   ProcedureReturn #True
EndProcedure
 
; ==================================
; YOUR PLUGIN PROCEDURES
; ==================================
 
 
Procedure ScintillaMsg(*point, msg, param1 = 0, param2 = 0)
  If Scintilla And *point
    ProcedureReturn Scintilla(*point, msg, param1, param2)
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
Procedure Test()
  ;MessageRequester("PB Plugin for notepad++", "Test... "+NppData\_scintillaMainHandle)
 
  *sciptr = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTPOINTER, 0, 0);хендл окна скинтиллы
  ScintillaMsg(*sciptr, #SCI_SETTEXT, 0, @"Привет всем, как дела!")
EndProcedure


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Ср июн 13, 2018 1:11 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
У него ещё есть процедура
Код:
1
2
3
4
5
6
Procedure MakeUTF8Text(text.s)
   Static buffer.s
   buffer=Space(StringByteLength(text, #PB_UTF8) + 1)
   PokeS(@buffer, text, -1, #PB_UTF8)
   ProcedureReturn @buffer
EndProcedure



Код:
1
2
        text$ = "Привет всем, как дела!"
        ScintillaMsg(*sciptr, #SCI_SETTEXT, 0, MakeUTF8Text(text$))


теперь вставилось как есть.

дело пошло, и вот я уже изменил размер шрифта :lol:
Код:
1
ScintillaMsg(*sciptr, #SCI_STYLESETSIZE,0,16)



уже есть поиск, один шаг (без цикла с поиском от найденного)
Код:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
;unicode - DLL - compiler x86
 
Structure NppData Align #PB_Structure_AlignC
        *_nppHandle
        *_scintillaMainHandle
        *_scintillaSecondHandle
EndStructure                
 
Structure ShortcutKey Align #PB_Structure_AlignC
        _isCtrl.b
        _isAlt.b
        _isShift.b
        _key.u ;i
EndStructure
 
Structure FuncItem Align #PB_Structure_AlignC
        _itemName.s{64}
        *_pFunc
        _cmdID.i
        _init2Check.b
        *_pShortcutKey.ShortcutKey
EndStructure
 
; ==================================
; 2 Обязательные процедуры DLL
; ==================================
Declare Test()
 
Prototype ScintillaDirect(sciptr, msg, param1 = 0, param2 = 0)
 
 
CompilerIf #PB_Compiler_LineNumbering=0
        CompilerError "Включите в настройках компилятора поддержку OnError"
CompilerEndIf
 
Procedure FatalError()
        Protected Result.s
       
        Result="Ошибка программы"
       
        CompilerIf #PB_Compiler_LineNumbering
                Result+" в строке "+ErrorLine()+", файла: "+GetFilePart(ErrorFile())
        CompilerEndIf
       
        Result+Chr(10)+Chr(10)+"Ошибка типа: "+Chr(34)+ErrorMessage()+Chr(34)
        MessageRequester("Ошибка программы!", Result, #MB_OK|#MB_ICONERROR)
EndProcedure
 
 
ProcedureDLL AttachProcess(Instance)
        ;
        ;<< Когда Notepad++ установил этот плагин >>
        ; Ваш код инициализации здесь
       
        OnErrorCall(@FatalError())
       
        ; Плаг может быть в AppData, нужен путь процесса Notepad++
        If OpenLibrary(0, "Scintilla.dll")=0
                If OpenLibrary(0, "..\Scintilla.dll")=0
                        If OpenLibrary(0, "SciLexer.dll")=0
                                OpenLibrary(0, "..\SciLexer.dll")
                        EndIf
                EndIf
        EndIf
       
        Global Scintilla.ScintillaDirect=0
       
        ; Если под номером 0 является открытая библиотека, получаем её функцию
        If IsLibrary(0)
                Scintilla = GetFunction(0, "Scintilla_DirectFunction")
        EndIf
        ;
        Global NppData.NppData
        Global PluginName.s="Highlight Color"
        Global Dim FuncsArray.FuncItem(1)   ; меню с 4 пунктами
        With FuncsArray(0)                                      ; 1) пункт меню с быстрой клавишой
                \_itemName="Подсветить текст"
                \_pFunc=@test()
                \_pShortcutKey=AllocateStructure(ShortcutKey)
                \_pShortcutKey\_isCtrl=#True
                \_pShortcutKey\_isShift=#True
                \_pShortcutKey\_isAlt=#True
                \_pShortcutKey\_key=#VK_NEXT
        EndWith                             ;2) разделитель в меню
                                                                                ;    With FuncsArray(1)
                                                                                ;       \_itemName=""
                                                                                ;    EndWith
                                                                                ;    With FuncsArray(2)                  ;3) пункт меню - чекбокс с галкой
                                                                                ;       \_itemName="Custom Option 1"
                                                                                ;       \_pFunc=@Test()
                                                                                ;       \_init2Check=#True
                                                                                ;    EndWith
                                                                                ;    With FuncsArray(3)                  ;4) пункт меню - чекбокс без галки
                                                                                ;       \_itemName="Custom Option 2"
                                                                                ;       \_pFunc=@Test()
                                                                                ;       \_init2Check=#False
                                                                                ;    EndWith
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
        ;
        ;<< Когда Notepad++ удаляет этот плагин >>
        ; Ваш код очистки здесь
        ;
        Protected i
        For i=0 To ArraySize(FuncsArray())
                FreeStructure(FuncsArray(i)\_pShortcutKey)
        Next
EndProcedure
 
; ==================================
; 5 Обязательные процедуры Notepad++
; ==================================
 
; NPP спрашивает, является ли плагин в юникоде, возвращаем "ДА"
ProcedureCDLL.i isUnicode()
        ProcedureReturn #PB_Compiler_Unicode
EndProcedure
 
; NPP спрашивает имя плагина
ProcedureCDLL.s getName()
        ProcedureReturn PluginName
EndProcedure
 
; NPP спрашивает, элементы меню, чтобы встроить их в меню "Плагины"
ProcedureCDLL.i getFuncsArray(*FuncsArraySize.Integer)
        *FuncsArraySize\i=ArraySize(FuncsArray())
        ProcedureReturn @FuncsArray()
EndProcedure
 
ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
        NppData\_nppHandle=*NppHandle
        NppData\_scintillaMainHandle=*ScintillaMainHandle
        NppData\_scintillaSecondHandle=*ScintillaSecondHandle
        ;
        ;<< Когда инфа Notepad++ изменилась >>
        ; Ваш код здесь
        ;
        ; мессага на запуске
        ; MessageRequester("PB Plugin for notepad++", ""+NppData\_scintillaMainHandle)
EndProcedure
 
ProcedureCDLL beNotified(*SCNotification.SCNotification)
        ;
        ;<< Когда было получено уведомление scintilla Notepad++ >>
        ; Ваш код здесь
        ;
EndProcedure
 
ProcedureCDLL.i messageProc(Message, wParam, lParam)
        ;
        ;<< Когда было получено windows-сообщение Notepad++ >>
        ; Ваш код здесь
        ;
        ProcedureReturn #True
EndProcedure
 
; ==================================
; Ваши процедуры плагина
; ==================================
 
 
Procedure ScintillaMsg(*point, msg, param1 = 0, param2 = 0)
        If Scintilla And *point
                ProcedureReturn Scintilla(*point, msg, param1, param2)
        Else
                ProcedureReturn 0
        EndIf
EndProcedure
 
Procedure MakeUTF8Text(text.s)
        Static buffer.s
        buffer=Space(StringByteLength(text, #PB_UTF8) + 1)
        PokeS(@buffer, text, -1, #PB_UTF8)
        ProcedureReturn @buffer
EndProcedure
 
; Это надо будет убрать, так как #PB_UTF8 однозначно
CompilerIf #PB_Compiler_Unicode
        #TextEncoding = #PB_UTF8
CompilerElse
        #TextEncoding = #PB_Ascii
CompilerEndIf
 
; какой то аналог предыдущей процедуры
Procedure MakeScintillaText(text.s, *sciLength.Integer=0)
        Static sciLength : sciLength=StringByteLength(text, #TextEncoding)
        Static sciText.s : sciText = Space(sciLength)
        If *sciLength : *sciLength\i=sciLength : EndIf ;<--- Возвращает длину буфера scintilla  (требуется для определенной команды scintilla)
        PokeS(@sciText, text, -1, #TextEncoding)
        ProcedureReturn @sciText
EndProcedure
 
Procedure Test()
        ;       получить активность scintilla, их же 2 окна, с каким работаем, в какой курсор
        ;MessageRequester("PB Plugin for notepad++", "Test... "+NppData\_scintillaMainHandle)
       
        *sciptr = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTPOINTER, 0, 0);хендл окна скинтиллы
                                                                                                                                                                         ; ScintillaMsg(*sciptr, #SCI_SETTEXT, 0, @"Привет всем, как дела!")
                                                                                                                                                                         ; text$ = "Привет всем, как дела!"
                                                                                                                                                                         ; ScintillaMsg(*sciptr, #SCI_SETTEXT, 0, MakeUTF8Text(text$)) ; вставляет текст взамен
                                                                                                                                                                         ;      ScintillaMsg(*sciptr, #SCI_STYLESETSIZE,0,16) ; работает, размер шрифта
       
        ; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
        ScintillaMsg(*sciptr, #SCI_SETSEARCHFLAGS,#SCFIND_REGEXP|#SCFIND_POSIX)
       
        ; Устанавливает целевой диапазон поиска
        txtLen = ScintillaMsg(*sciptr, #SCI_GETTEXTLENGTH) ; получает длину текста
        ScintillaMsg(*sciptr, #SCI_SETTARGETSTART, 0)      ; от начала
        ScintillaMsg(*sciptr, #SCI_SETTARGETEND, txtLen)   ; до конца по длине текста
                                                                                                           ; MessageRequester("Длина текста", StrD(txtLen))
       
       
        ; Поиск
        regex=MakeScintillaText("\w+\$",@regexLength) ; пока не понятно откуда взялось regexLength, пустая переменная в которую возвр. указатель
                                                                                                  ;regex=MakeScintillaText("(\W)(.+)\1",@regexLength)
        firstMatchPos=ScintillaMsg(*sciptr, #SCI_SEARCHINTARGET,regexLength,regex) ; возвращает позицию первого найденного
        If firstMatchPos>-1                                                                                                                ; если больше -1, то есть найдено, то
                                                                                                                                                           ; MessageRequester("Позиция найденного текста", StrD(firstMatchPos))
                firstMatchStartPos=ScintillaMsg(*sciptr, #SCI_GETTARGETSTART)              ; высылает позицию начала найденного
                firstMatchEndPos=ScintillaMsg(*sciptr, #SCI_GETTARGETEND)                          ; высылает позицию конца найденного
                ScintillaMsg(*sciptr,#SCI_SETSEL,firstMatchStartPos,firstMatchEndPos)  ; выделяет текст используя позиции начала и конца
                                                                                                                                                           ; ScintillaMsg(*sciptr, #SCI_GOTOPOS, firstMatchStartPos)                            ; переместить курсор к найденному
        EndIf
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Чт июн 14, 2018 4:02 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Пётр
Вот уже получилось подсветить текст (переменные типа word$) с использованием поиска

Код:
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
Procedure Test()
        ;       получить активность scintilla, их же 2 окна, с каким работаем, в какой курсор
        ;MessageRequester("PB Plugin for notepad++", "Test... "+NppData\_scintillaMainHandle)
       
        *sciptr = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTPOINTER, 0, 0) ; хендл окна scintilla
       
        ; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
        ScintillaMsg(*sciptr, #SCI_SETSEARCHFLAGS,#SCFIND_REGEXP|#SCFIND_POSIX)
       
        ; Устанавливает целевой диапазон поиска
        txtLen = ScintillaMsg(*sciptr, #SCI_GETTEXTLENGTH) ; получает длину текста
        ScintillaMsg(*sciptr, #SCI_SETTARGETSTART, 0)      ; от начала
        ScintillaMsg(*sciptr, #SCI_SETTARGETEND, txtLen)   ; до конца по длине текста
                                                                                                           ; MessageRequester("Длина текста", StrD(txtLen))
        ScintillaMsg(*sciptr,#SCI_INDICSETSTYLE, 7, 17)  ; #INDIC_TEXTFORE = 17 создат индикатор под номером 7 (занятые по уиолчанию 0, 1, 2)
        ScintillaMsg(*sciptr,#SCI_INDICSETFORE, 7, $71AE71) ; назначает цвет индикатора под номером 7 - зелёный
        ; ScintillaMsg(*sciptr,#SCI_SETINDICATORCURRENT, 7) ; если тут задать текущий, то сбрасывается на втором шаге цикла
       
        ; Поиск
        regex=MakeScintillaText("\w+\$",@regexLength) ; пока не понятно откуда взялось regexLength, пустая переменная в которую возвр. указатель, объявили внутри вызова что-ли
        EndPos = 0
        Repeat
                ScintillaMsg(*sciptr, #SCI_SETTARGETSTART, EndPos)         ; от начала (задаём область поиска) используя позицию конца предыдущего поиска
                ScintillaMsg(*sciptr, #SCI_SETTARGETEND, txtLen)   ; до конца по длине текста
                firstMatchPos=ScintillaMsg(*sciptr, #SCI_SEARCHINTARGET,regexLength,regex) ; возвращает позицию первого найденного
                If firstMatchPos>-1                                                                                                                ; если больше -1, то есть найдено, то
                        StartPos=ScintillaMsg(*sciptr, #SCI_GETTARGETSTART)                ; получает позицию начала найденного
                        EndPos=ScintillaMsg(*sciptr, #SCI_GETTARGETEND)                    ; получает позицию конца найденного
                        ScintillaMsg(*sciptr, #SCI_GOTOPOS, EndPos)                             ; перемещает курсор к найденному, чтобы следить за происходящим
                        ; ScintillaMsg(*sciptr,#SCI_SETSEL,StartPos,EndPos)  ; выделяет текст используя позиции начала и конца
                        ScintillaMsg(*sciptr,#SCI_SETINDICATORCURRENT, 7) ; делает индикатор под номером 7 текущим
                        ScintillaMsg(*sciptr,#SCI_INDICATORFILLRANGE, StartPos, EndPos - StartPos)  ; выделяет текст используя текущий индикатор
                       
                        MessageRequester("Длина текста" + StrD(txtLen), "Найдено" + #TAB$ + StrD(firstMatchPos) + #CRLF$ + "начало" + #TAB$ + StrD(StartPos) + #CRLF$ + "конец" + #TAB$ + StrD(EndPos))
                Else
                        Break
                EndIf
        ForEver
EndProcedure



теперь надо придумывать GUI, где задавать рег.выр. и цвет. В будущем типа выбрать конфигурацию под названием типа "Мой синтаксис", а в конфиге под этим именем набор регулярок и связанных с ним цветов. То есть разными цветами подсветил текст. Или в гуи сделать разовую подсветку, то есть поле рег.выр. и кнопка с выбором цвета, а ниже раскрывающийся список с именами заготовленных конфигураций. А напротив поля разовой подсветки кнопка "Добавить", при нажатии которой предлагает добавить в выбранный или создать если не выбрано ничего. Похоже я замучаюсь делать то что написал. я пока не представляю как написать дочернее окно, типа как обычно внутри процедуры и ничего сложного(?).

новая версия
Код:
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
Procedure Color(regex1$, Color1.q, n)
        ;       получить активность scintilla, их же 2 окна, с каким работаем, в какой курсор
        ;MessageRequester("PB Plugin for notepad++", "Test... "+NppData\_scintillaMainHandle)
       
        ; MessageRequester("ini", "Color1" + #TAB$ + StrU(Color1, #PB_Quad) + #CRLF$ + "regex1" + #TAB$ + regex1$)
        *sciptr = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTPOINTER, 0, 0) ; хендл окна scintilla
       
        ; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
        ScintillaMsg(*sciptr, #SCI_SETSEARCHFLAGS,#SCFIND_REGEXP|#SCFIND_POSIX)
       
        ; Устанавливает целевой диапазон поиска
        txtLen = ScintillaMsg(*sciptr, #SCI_GETTEXTLENGTH) ; получает длину текста
        ScintillaMsg(*sciptr, #SCI_SETTARGETSTART, 0)      ; от начала
        ScintillaMsg(*sciptr, #SCI_SETTARGETEND, txtLen)   ; до конца по длине текста
                                                                                                           ; MessageRequester("Длина текста", StrD(txtLen))
        ScintillaMsg(*sciptr,#SCI_INDICSETSTYLE, n, 17)    ; #INDIC_TEXTFORE = 17 создат индикатор под номером 7 (занятые по уиолчанию 0, 1, 2)
        ScintillaMsg(*sciptr,#SCI_INDICSETFORE, n, Color1) ; назначает цвет индикатора под номером 7 - зелёный
                                                                                                           ; ScintillaMsg(*sciptr,#SCI_SETINDICATORCURRENT, 7) ; если тут задать текущий, то сбрасывается на втором шаге цикла
       
        ; Поиск
        regex=MakeScintillaText(regex1$,@regexLength) ; пока не понятно откуда взялось regexLength, пустая переменная в которую возвр. указатель, объявили внутри вызова что-ли
        EndPos = 0
        Repeat
                ScintillaMsg(*sciptr, #SCI_SETTARGETSTART, EndPos)         ; от начала (задаём область поиска) используя позицию конца предыдущего поиска
                ScintillaMsg(*sciptr, #SCI_SETTARGETEND, txtLen)           ; до конца по длине текста
                firstMatchPos=ScintillaMsg(*sciptr, #SCI_SEARCHINTARGET,regexLength,regex) ; возвращает позицию первого найденного
                If firstMatchPos>-1                                                                                                                ; если больше -1, то есть найдено, то
                        StartPos=ScintillaMsg(*sciptr, #SCI_GETTARGETSTART)                                        ; получает позицию начала найденного
                        EndPos=ScintillaMsg(*sciptr, #SCI_GETTARGETEND)                                            ; получает позицию конца найденного
                        ScintillaMsg(*sciptr, #SCI_GOTOPOS, EndPos)                                                        ; перемещает курсор к найденному, чтобы следить за происходящим
                                                                                                                                                                   ; ScintillaMsg(*sciptr,#SCI_SETSEL,StartPos,EndPos)  ; выделяет текст используя позиции начала и конца
                        ScintillaMsg(*sciptr,#SCI_SETINDICATORCURRENT, n)                                          ; делает индикатор под номером 7 текущим
                        ScintillaMsg(*sciptr,#SCI_INDICATORFILLRANGE, StartPos, EndPos - StartPos)  ; выделяет текст используя текущий индикатор
                       
                        ; MessageRequester("Длина текста" + StrD(txtLen), "Найдено" + #TAB$ + StrD(firstMatchPos) + #CRLF$ + "начало" + #TAB$ + StrD(StartPos) + #CRLF$ + "конец" + #TAB$ + StrD(EndPos))
                Else
                        Break
                EndIf
        ForEver
EndProcedure
 
Procedure Test()
        Protected Color1.q, regex1$, n=3, BGR$
        ; OpenPreferences("Config\Highlight.ini") ; открываем ini
        OpenPreferences(GetCurrentDirectory() + "plugins\Config\Highlight.ini") ; открываем ini
                                                                                                                                                        ; MessageRequester("Путь", GetCurrentDirectory() + "plugins\Config\Highlight.ini")
        PreferenceGroup("color_regexp")                                                                                 ; выбираем группу (секцию)
        ExaminePreferenceKeys()
        While NextPreferenceKey()
                BGR$ = PreferenceKeyName()
                Color1.q = Val("$" + Mid(BGR$, 5, 2)+Mid(BGR$, 3, 2)+Mid(BGR$, 1, 2))
                regex1$ = PreferenceKeyValue()
               
                ; MessageRequester("ini", "Color1" + #TAB$ + StrU(Color1, #PB_Quad) + #CRLF$ + "regex1" + #TAB$ + regex1$)
                Color(regex1$, Color1, n)
                n+1
        Wend
        ClosePreferences()
EndProcedure



DLL + конфиг
тут пример с обработкой кода PureBasic с помощью регулярных выражений. То есть сверху-вниз применяются указанные рег.выры со связанным цветом. Уже интересный результат.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Чт июн 14, 2018 10:09 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AZJIO писал(а):
Вот уже получилось подсветить текст
Хорошо получилось, только цвета видимо для темного фона. На светлом, текст видно не очень хорошо.

AZJIO писал(а):
я пока не представляю как написать дочернее окно
Его можно сделать в дизайнере форм. Код с окном в DLL недавно выкладывал на форуме. viewtopic.php?p=89354#p89354
Отличия минимальны. Вместо организации цикла с WaitWindowEvent нужно связать функцией BindEvent необходимые события с процедурой, где разместить их обработчик.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Чт июн 14, 2018 5:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AZJIO писал(а):
я пока не представляю как написать дочернее окно
Добавил в код плагина окно с кнопкой нажатие на которую подсвечивает синтаксис.


Вложения:
Highlight.zip.7z [28.65 KiB]
Скачиваний: 25

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Сб июн 16, 2018 7:29 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Пётр
Добавил комбо в гуи, поля для ввода регвыра и цвета и даже попробовал, но столкнулся с тем что индикатор в Scintilla не просто подсветил и забыл, а реагирует на изменение цвета, то есть я выделил зелёным некий текст, далее хочу другим цветом выделить другой используя тот же номер индикатора, и он меняет в новый цвет и ранее подсвеченный текст. Отсюда меняется подход, то есть нужно указать палитру цветов от 9 до 18, остальные 0-9 и 31-35 зарезервированы Scintilla под свои нужды (в описании), 19-30 - заняты, провреил тестом, от 3 до 18 свободны, остаётся 17 цветов, в принципе достаточно. Пытался найти иной способ, ведь синтаксисы в Notepad++ не ограничены, там 20-30 языков и для каждого с десяток и более элементов подсветки. В общем я пока думаю.

Итак, новая версия, подрихтовал вышеописанные проблемы, оставив использование индикаторов, описание в архиве (ini поменялся, заменить).
ссылки переместил в первый пост.

почитал про лексер и функции, но не понял как использовать. Вроде указано, что лексер позволяет при отсутствии существующего сделать самодельный, но пока не разобрался. Смотреть SCI_SETLEXER(int lexer) и функции ниже по списку.


Последний раз редактировалось AZJIO Ср июн 20, 2018 7:12 am, всего редактировалось 7 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Пн июн 18, 2018 10:41 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
решил сделать языковую поддержку, сделал код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim aLng.s(7)
aLng(1) = "Syntax highlighting"
aLng(2) = "Highlight text"
aLng(3) = "Highlight"
aLng(4) = "Clear"
aLng(5) = "Clear all"
aLng(6) = "Highlight Syntax"
aLng(7) = "Add"
 
If FileSize(GetCurrentDirectory() + "plugins\Config\Highlight_Lang.ini")
 
        aLng(0) = "7"
        OpenPreferences(GetCurrentDirectory() + "plugins\Config\Highlight_Lang.ini") ; открываем ini
        PreferenceGroup("Lang") ; выбираем группу (секцию)
        ExaminePreferenceKeys()
        For i=1 To 7
                If NextPreferenceKey()
                        aLng(i) = PreferenceKeyName()
                Else
                        Break
                EndIf
        Next
EndIf
 



но там где я подставляю код aLng(1) и т.д. пишет что не функция не макрос не пойми что.
я уже гуи в общий файл засунул, не видит он массив


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Пн июн 18, 2018 11:16 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Этот код нормально компилируется.
Видимо дело в том что массив не глобальный, а код находится в процедуре. Нужно объявить массив глобальным.
Код:
1
Global Dim aLng.s(7)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин подсветки для Notepad++
СообщениеДобавлено: Вт июн 19, 2018 5:36 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 202
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Пётр
Обновил ссылки 3-мя постами назад. В общем всё работает и русификатор и ini-файл. Кроме того перед добавлением функционала создания ini-файла проверил как будет падать без ini, и добавил проверки как положено. Мало ли, в друг доступ будет ограничен для записи, и теперь любые кнопки нажимай, не вызывает проблем. Единственное я не понял, почему при запуске без ini, у меня 2 комбо пустые, а там где цвет тоже пустой но его высота как будто он добавил столько же пунктов но пустых. Проверил ещё раз условия, не напутал ли где, используя клавишу Ctrl+M, всё нормально в блоках.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB