Если вы школьник 12-14 лет или дядя-хикка, решили возвысить свое ЧСВ, написать свой нубо-язык программирования из 1-3 команд, с нубо парсером, не умеющем распарсивать строку из 2 и более команд; при этом падающем чуть реже, чем всегда - то вам нужен собственный редактор, с подсветкой вашего 'синтаксиса' не так ли? ;D Ну это все шутки. К делу...
Вот единственный адекватный код для подсветки синтаксиса в инвалидном RichEdit'e на языке AuIT от 'Δαηy Δαηy'.
Код отрабатывает на ура, ничего не мигает и не трясется, т.к. прорисовка RichEdit приостанавливается на время очередной проверки, при этом возможность ввода не блокируется.
Пояснение (что код делает): на ходу раскрашивает все вводимые слова 'процедура, кпроц, main, возврат' в красный и слово 'include' в зеленый; при этом, если слово было нарушено (удалением символа например), то оно будет обращено в стандартный цвет (черный). Копируйте код и пробуйте.
Единственный недочет, вы должны найти код для нахождения позиции в RE и ее установки; это написано в комментариях к коду, иначе редактирование текста/кода где-то в середине, будет невыполнимой задачей, каретка будет устанавливаться в конец текста, при каждом нажатии клавиши.
И да, код неидеальный, но вполне адекватный. Если у вас есть свой код подсветки синтаксиса - делитесь.
Интересно узнать мнение old форумчан, модераторов, админов, любых людей с адекватной критикой.
Сам код:
Вот единственный адекватный код для подсветки синтаксиса в инвалидном RichEdit'e на языке AuIT от 'Δαηy Δαηy'.
Код отрабатывает на ура, ничего не мигает и не трясется, т.к. прорисовка RichEdit приостанавливается на время очередной проверки, при этом возможность ввода не блокируется.
Пояснение (что код делает): на ходу раскрашивает все вводимые слова 'процедура, кпроц, main, возврат' в красный и слово 'include' в зеленый; при этом, если слово было нарушено (удалением символа например), то оно будет обращено в стандартный цвет (черный). Копируйте код и пробуйте.
Единственный недочет, вы должны найти код для нахождения позиции в RE и ее установки; это написано в комментариях к коду, иначе редактирование текста/кода где-то в середине, будет невыполнимой задачей, каретка будет устанавливаться в конец текста, при каждом нажатии клавиши.
И да, код неидеальный, но вполне адекватный. Если у вас есть свой код подсветки синтаксиса - делитесь.
Интересно узнать мнение old форумчан, модераторов, админов, любых людей с адекватной критикой.
Сам код:
Код:
#include <guiconstantsex.au3>
#include <guirichedit.au3>
#include <windowsconstants.au3>
#include <misc.au3>
opt('guioneventmode', 1)
global $g_hrichedit
cock()
func cock()
local $hgui, $imsg, $idbtnnext, $istep = 0
$hgui = guicreate("Danilka super super coder :3", 320, 350, -1, -1)
$g_hrichedit = _guictrlrichedit_create($hgui, "", 10, 10, 300, 220, _
bitor($es_multiline, $ws_vscroll, $ws_hscroll, $es_autovscroll))
guisetonevent($gui_event_close, '__exit')
guisetstate(@sw_show)
global $dll_32 = dllopen('user32.dll')
sleep(2000)
while 1
sleep(100)
;if guigetmsg() = $gui_event_close then __exit()
$last = 1000000
if (_ispressed(11, $dll_32) = false) and (_ispressed("08", $dll_32) _
or _ispressed(41, $dll_32) or _ispressed(42, $dll_32) or _ispressed(43, $dll_32) _
or _ispressed(44, $dll_32) or _ispressed(45, $dll_32) or _ispressed(46, $dll_32) _
or _ispressed(47, $dll_32) or _ispressed(48, $dll_32) or _ispressed(49, $dll_32) _
or _ispressed('4a', $dll_32) or _ispressed('4b', $dll_32) or _ispressed('4c', $dll_32) _
or _ispressed('4d', $dll_32) or _ispressed('4e', $dll_32) or _ispressed('4f', $dll_32) _
or _ispressed(50, $dll_32) or _ispressed(51, $dll_32) or _ispressed(52, $dll_32) _
or _ispressed(53, $dll_32) or _ispressed(54, $dll_32) or _ispressed(55, $dll_32) _
or _ispressed(56, $dll_32) or _ispressed(57, $dll_32) or _ispressed(58, $dll_32) _
or _ispressed(59, $dll_32) or _ispressed('5a', $dll_32)) then
for $i = 1 to 2 ; сканируем последнее слово
; 1 итерация - скан пробела
; 2 - скан самого слова
guisetcursor(-1, '', $hgui)
_guictrlrichedit_pauseredraw($g_hrichedit)
$pos1 = _guictrlrichedit_getcharposofpreviousword($g_hrichedit, $last)
if $pos1 < 0 then ; чтобы не начал выделять то, чего нет.
$i = 2 ; выход до срока
else
;!!!!!! тут должна быть команда, которая получает текущую позицию курсора (каретки)
_guictrlrichedit_setsel($g_hrichedit, $pos1, $last)
$last = $pos1
$text = _guictrlrichedit_getseltext($g_hrichedit)
if stringregexp($text, '(?:^процедура[ ]{0,100}$|^кпроц[ ]{0,100}$|^main[ ]{0,100}$|^возврат[ ]{0,100}$)') then
_guictrlrichedit_setcharcolor($g_hrichedit, 0x000099)
_guictrlrichedit_setsel($g_hrichedit, -1, -1) ; убрать, когда будет код возврата курсора
elseif stringregexp($text, '(?:^include[ ]{0,100}$)') then
_guictrlrichedit_setcharcolor($g_hrichedit, 0x009900)
_guictrlrichedit_setsel($g_hrichedit, -1, -1) ; убрать, когда будет код возврата курсора
else
_guictrlrichedit_setcharcolor($g_hrichedit, 0x000000)
_guictrlrichedit_setsel($g_hrichedit, -1, -1) ; убрать, когда будет код возврата курсора
endif
;!!!!!! тут должна быть команда, которая восстанавливает позицию курсора (каретки)
endif
next
_guictrlrichedit_resumeredraw($g_hrichedit)
endif
wend
endfunc
func __exit()
dllclose('user32.dll')
exit
endfunc
OffTopic:
Я сам с презрением к RichEdit'у отношусь, но это попытка, эмм... попытка дать хоть какой-то разум такому 'тупому' элементу, как RichEdit.
Я сам с презрением к RichEdit'у отношусь, но это попытка, эмм... попытка дать хоть какой-то разум такому 'тупому' элементу, как RichEdit.