Показать полную графическую версию : Как реализовать подсветку кода?
Здравствуйте. В поле edit находиться текст с bb тегами. Нужно подсветить определённые теги определённым стилем (например, тег сдалать зелёным, а тег сделать жирным). Вопрос: как это реализовать. Подскажите пожалуйста. Заранее спасибо.
Нужно использовать RichEdit.
Вывод текста в элемент RichEdit с поддержкой тегов (http://autoit-script.ru/index.php/topic,3417.0.html)
Creat0R, а можно сделать так, чтобы в примере, на который вы дали ссылку, теги не убирались.
И ещё: можно ли сделать так, чтобы пользователь мог редактировать код, и если пользователь вставил новый тег, то сразу автоматом приписывался нужный стиль, и наоборот, если пользователь убрал тег, то и стиль убирался.
Pavluha,
Всё возможно.
См. описание к функциям _GUICtrlRichEdit_* в справке.
Как то так:
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <GUIConstantsEx.au3>
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <WindowsConstants.au3>
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <GUIRichEdit.au3>
$sEditText = ''
$hGUI = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("Test Script", 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_create.htm)($hGUI, 'Some data with tags , , and more.', 20, 20, 260, 160, BitOR (http://www.autoitscript.com/autoit3/docs/functions/BitOR.htm)($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_show), $hGUI)
AdlibRegister (http://www.autoitscript.com/autoit3/docs/functions/AdlibRegister.htm)('_SetEdit', 100)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_destroy.htm)($hRichEdit)
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _SetEdit()
$aPos = _GUICtrlRichEdit_GetSel (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_getsel.htm)($hRichEdit)
$sData = _GUICtrlRichEdit_GetText (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_gettext.htm)($hRichEdit)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sEditText <> $sData Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sEditText = $sData
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
_GUICtrlRichEdit_SetReadOnly (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setreadonly.htm)($hRichEdit, True (http://www.autoitscript.com/autoit3/docs/keywords.htm#True))
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aTags[2][3] = [['', 'bo', 0x000000], ['', '', 0x0FFF00]]
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aTags)-1
StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($sData, $aTags[$i][0], '')
$iC = @extended (http://www.autoitscript.com/autoit3/docs/macros.htm#@extended)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $j = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iC
$iPos = StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($sData, $aTags[$i][0], 2, $j)
_GUICtrlRichEdit_SetSel (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setsel.htm)($hRichEdit, $iPos-1, $iPos + StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($aTags[$i][0])-1)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iPos Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aTags[$i][1] <> '' Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
_GUICtrlRichEdit_SetCharAttributes (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setcharattributes.htm)($hRichEdit, '+' & $aTags[$i][1])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
_GUICtrlRichEdit_SetCharColor (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setcharcolor.htm)($hRichEdit, $aTags[$i][2])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
_GUICtrlRichEdit_SetSel (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setsel.htm)($hRichEdit, $aPos[0], $aPos[1])
_GUICtrlRichEdit_SetCharAttributes (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setcharattributes.htm)($hRichEdit, '-' & $aTags[$i][1])
;_GUICtrlRichEdit_SetCharColor($hRichEdit, Default)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
_GUICtrlRichEdit_SetReadOnly (http://dundats.mvps.org/help/html/libfunctions/_guictrlrichedit_setreadonly.htm)($hRichEdit, False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False))
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Creat0R, спасибо ещё раз, правда в вашем коде есть ошибочка (some text не выделяет), но я это исправлю сам.
в вашем коде есть ошибочка (some text не выделяет) »
Это не ошибка, я не рассчитывал на это.
В первом сообщении указано «тег сдаелать зелёным, а тег сделать жирным», с этого я понял что теги идут вместе, не обрамляя текст.
Исправить можно так:
...
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aTags[4][3] = [['', 'bo', 0x000000], ['', 'bo', 0x000000], ['', '', 0x0FFF00], ['', '', 0x0FFF00]]
...
хотя содержимое между тегами не будет подсвечиваться.
Creat0R, я заметил, что если текста в поле очень много, то создаётся ненужная прокрутка текста (попробуйте написать текста столько, что он уже не вместиться весь и появиться прокрутка). Как это исправить.
И ещё. Если очень быстро печатать, то часть символов каким-то странным образом оказывается с правой стороны от курсора ввода. Поставил задержку 500 мс, и всё нормализовалось, правда не так быстро подсвечивается код.
Как это исправить »
Убрать $WS_VSCROLL из стилей элемента.
Если очень быстро печатать, то часть символов каким-то странным образом оказывается с правой стороны от курсора ввода
Да есть такое, есть ещё несколько глюков, нужно дорабатывать пример.
Я делал это на скорую руку, тестировать особо времени не было.
Creat0R, вы не так поняли (или это я не так сказал). Сама полоска прокрутки нужна. Просто когда текста слишком много, а ты допечатываешь, то текст сам по себе прокручивается от начала до конца. Скорее всего, это из-за функции _GUICtrlRichEdit_SetSel
когда текста слишком много, а ты допечатываешь, то текст сам по себе прокручивается от начала до конца »
У меня не прокручивается.
это из-за функции _GUICtrlRichEdit_SetSel »
Она восстанавливает исходную позицию курсора.
Creat0R, http://autoit-script.ru/autoit3_docs/libfunctions/_guictrlrichedit_setsel.htm
Устанавливает выделение текста в указанных позициях начала и конца
У меня не прокручивается. »
возьмите строк так 1000 или больше, и поглядите.
Устанавливает выделение текста в указанных позициях начала и конца »
Мне не нужна цитата из справки, я и так в неё заглядываю прежде чем использовать функцию ;)
Я написал про восстановление т.к в коде у меня сначала получается текущая позиция выделения, а потом происходит восстановление.
Creat0R, тогда есть другие варианты раскрасить текст, при этом не выделяя его?
Скачай сборник скриптов (http://azjio.ucoz.ru/load/vsjo_dlja_autoit3/kollekcii/kollekcija_skriptov/5-1-0-2), сделай поиск файла RESH_Mod_Example.au3. Это упрощённый аналог RESHv2.2 от Beege. Я хотел выяснить как делается подсветка и упростил скрипт до минимума. Смысл такой: функции _GUICtrlRichEdit_Stream... работают с данными как бы в сыром режиме. Это как HTML, который мы видим как текст, на самом деле в это текстовый файл, где слова обрамлены тегами. Аналогично и здесь, в "шапке" файла заданы стили, далее по тексту идут теги. Задача обрамить текст тегами и вставить в RichEdit. Условия обрамления это уже другой вопрос, но факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее, чем вызывать специальные функции, которые будут выделять текст и ещё сопровождаться мельканием тексты при вызове.
AZJIO, буду значит учить разметку RTF. Твоя идея выглядит очень хорошо, если к этому добавить ещё автообновление раскраски каждые, например, 100 мс.
Ещё небольшой вопрос: как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++
факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее »
Но его придётся обрабатывать в файле я так понял?
Я не нашёл как без записи в файл изменять Stream...
как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++ »
Если как в редакторах, то это совсем не тривиальная задача.
Но есть _GUICtrlRichEdit_SetParaNumbering, которая добавит нумерацию строк внутри элемента.
Я не нашёл как без записи в файл изменять Stream... »
_GUICtrlRichEdit_StreamToVar, _GUICtrlRichEdit_StreamFromVar. А вообще глядя на пример о котором я писал выше, так в нём _GUICtrlRichEdit_SetText вставляет форматированный текст. Хотя так не должно быть, потому что теги должны вставляется как есть. Я, конечно, могу потестить, но мне это не надо...
Твоя идея выглядит очень хорошо, если к этому добавить ещё автообновление раскраски каждые, например, 100 мс. » Не уверен что это хорошая идея. Тестируйте, пробуйте варинаты с добавлением текста (не перезапись всего) и изменение флага модификации _GUICtrlRichEdit_IsModified, который позволит определить изменение текста, а не изменять когда это не требуется.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.