Что нового

Код для написания собственного редактора с подсветкой синтаксиса (RichEdit)

ArtistTo

Новичок
Сообщения
42
Репутация
2
Если вы школьник 12-14 лет или дядя-хикка, решили возвысить свое ЧСВ, написать свой нубо-язык программирования из 1-3 команд, с нубо парсером, не умеющем распарсивать строку из 2 и более команд; при этом падающем чуть реже, чем всегда - то вам нужен собственный редактор, с подсветкой вашего 'синтаксиса' не так ли? ;D Ну это все шутки. К делу...

Вот единственный адекватный код для подсветки синтаксиса в инвалидном 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.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
;D ну код конечно полное г, что еще сказать. Вряд ли он адекватный, как пишет автор, больше похоже на высер написанный за 5 минут.
Из багов сразу заметно, что из за задержки в 100 мс нельзя быстро печатать, может легко потерять все выделение и перекрасить все в черный. При удалении легко стирает все под чистую.
 
Автор
A

ArtistTo

Новичок
Сообщения
42
Репутация
2
Ты лучший, так и есть. Но от RichEdit, что ты хотел? :D


Добавлено:
Сообщение автоматически объединено:

Просто если кто-то кинет код лучше этого под RichEdit контрол, я буду удивлен, да.
Сейчас пишу редактор на основе html, чтобы замены делались шустро, буду юзать ява скрипт. Думаю вообще с 0 начать писать... Кажется придется.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Δαηy Δαηy [?]
От него я хотел, что бы его вообще не было. Он мне портил юникод в одном проекте.
Δαηy Δαηy, у тебя ник Δαηy Δαηy или ArtistTo, как ты это делаешь? :smile:
 
Автор
A

ArtistTo

Новичок
Сообщения
42
Репутация
2

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Δαηy Δαηy [?]
Мне для прикола Creator изменил.
, ясно.

Я в RichEdit писал так:
"{\rtf1\utf8{\fonttbl{\f0\fnil\fcharset204 " & $sFontname & ";}}{\colortbl;\red" & $iRed & "\green" & $iGreen & "\blue" & $iBlue & ";}\cf1 {\fs" & $iFontSize * 2 & " {" & $sUnicode & "}}\cf0}"
 
Автор
A

ArtistTo

Новичок
Сообщения
42
Репутация
2
inververs сказал(а):
Δαηy Δαηy [?]
Мне для прикола Creator изменил.
, ясно.

Я в RichEdit писал так:
"{\rtf1\utf8{\fonttbl{\f0\fnil\fcharset204 " & $sFontname & ";}}{\colortbl;\red" & $iRed & "\green" & $iGreen & "\blue" & $iBlue & ";}\cf1 {\fs" & $iFontSize * 2 & " {" & $sUnicode & "}}\cf0}"

Я не понял, как!? Как RTF применить к RichEdit'у? В AuIT у меня не получалось... Куда это вставить иил что написать, чтобы RIchEdit по твоему шаблону строил текст?? ;)


Добавлено:
Сообщение автоматически объединено:

Аууууууууу, есть кто онлайн? Как rtf применить в auit'e???
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну,как, RichEdit понимает RTF, ты что не знал? Через
Код:
_GUICtrlRichEdit_AppendText
 
Автор
A

ArtistTo

Новичок
Сообщения
42
Репутация
2
inververs сказал(а):
Ну,как, RichEdit понимает RTF, ты что не знал? Через
Код:
_GUICtrlRichEdit_AppendText
Эмм, вообще не видел в хелпе этой команды, только settext у меня есть...

Я догадывался, что вставка RTF реальна, по картинке Windows в одном из примеров хелпа, но на деле не знал.
Лол.


Добавлено:
Сообщение автоматически объединено:

Уахахахаах!!!
Ахахахаххаа!!!
Ни у кого нет кода, для подсветки синтаксиса! Следовательно мой код лучший, т.к. вообще единственный :whistle: :rofl:

Может быть какой-то крутой админ кинет код, который переплюнул бы мой? :whistle:


Добавлено:
Сообщение автоматически объединено:

Жду админов, что они думают, есть ли у них код лучше.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Δαηy Δαηy [?]
Если вы не перестаните вести себя вызывающе, дождётесь.
Вы на форум пришли балтавнёй заниматься или делом?
Или пишите по делу или прекращайте мусорить на форуме!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Не поднимайте тему чаще чем раз в 24 часа. В следующий раз будет постоянный бан. Этот форум не для школоты.
 
Автор
A

ArtistTo

Новичок
Сообщения
42
Репутация
2
Yashied сказал(а):
Не поднимайте тему чаще чем раз в 24 часа. В следующий раз будет постоянный бан. Этот форум не для школоты.
А я не школота уже 6 месяцев. Лол. Я просто хочу понять, есть ли код, который подсвечивал бы код лучше, с помощью RichEdit.
 
Верх