Войти

Показать полную графическую версию : Как реализовать подсветку кода?


Страниц : [1] 2

Pavluha
25-08-2012, 18:11
Здравствуйте. В поле edit находиться текст с bb тегами. Нужно подсветить определённые теги определённым стилем (например, тег сдалать зелёным, а тег сделать жирным). Вопрос: как это реализовать. Подскажите пожалуйста. Заранее спасибо.

Creat0R
25-08-2012, 19:38
Нужно использовать RichEdit.
Вывод текста в элемент RichEdit с поддержкой тегов (http://autoit-script.ru/index.php/topic,3417.0.html)

Pavluha
25-08-2012, 20:54
Creat0R, а можно сделать так, чтобы в примере, на который вы дали ссылку, теги не убирались.

И ещё: можно ли сделать так, чтобы пользователь мог редактировать код, и если пользователь вставил новый тег, то сразу автоматом приписывался нужный стиль, и наоборот, если пользователь убрал тег, то и стиль убирался.

Creat0R
26-08-2012, 00:33
Pavluha,
Всё возможно.
См. описание к функциям _GUICtrlRichEdit_* в справке.

Creat0R
26-08-2012, 02:00
Как то так:

#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)

Pavluha
26-08-2012, 11:42
Creat0R, спасибо ещё раз, правда в вашем коде есть ошибочка (some text не выделяет), но я это исправлю сам.

Creat0R
26-08-2012, 12:23
в вашем коде есть ошибочка (some text не выделяет) »
Это не ошибка, я не рассчитывал на это.
В первом сообщении указано «тег сдаелать зелёным, а тег сделать жирным», с этого я понял что теги идут вместе, не обрамляя текст.

Исправить можно так:
...
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aTags[4][3] = [['', 'bo', 0x000000], ['', 'bo', 0x000000], ['', '', 0x0FFF00], ['', '', 0x0FFF00]]
...
хотя содержимое между тегами не будет подсвечиваться.

Pavluha
26-08-2012, 12:42
Creat0R, я заметил, что если текста в поле очень много, то создаётся ненужная прокрутка текста (попробуйте написать текста столько, что он уже не вместиться весь и появиться прокрутка). Как это исправить.

И ещё. Если очень быстро печатать, то часть символов каким-то странным образом оказывается с правой стороны от курсора ввода. Поставил задержку 500 мс, и всё нормализовалось, правда не так быстро подсвечивается код.

Creat0R
26-08-2012, 13:37
Как это исправить »
Убрать $WS_VSCROLL из стилей элемента.

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

Pavluha
26-08-2012, 13:58
Creat0R, вы не так поняли (или это я не так сказал). Сама полоска прокрутки нужна. Просто когда текста слишком много, а ты допечатываешь, то текст сам по себе прокручивается от начала до конца. Скорее всего, это из-за функции _GUICtrlRichEdit_SetSel

Creat0R
26-08-2012, 14:34
когда текста слишком много, а ты допечатываешь, то текст сам по себе прокручивается от начала до конца »
У меня не прокручивается.

это из-за функции _GUICtrlRichEdit_SetSel »
Она восстанавливает исходную позицию курсора.

Pavluha
26-08-2012, 17:27
Creat0R, http://autoit-script.ru/autoit3_docs/libfunctions/_guictrlrichedit_setsel.htm

Устанавливает выделение текста в указанных позициях начала и конца

Pavluha
26-08-2012, 17:55
У меня не прокручивается. »
возьмите строк так 1000 или больше, и поглядите.

Creat0R
26-08-2012, 20:18
Устанавливает выделение текста в указанных позициях начала и конца »
Мне не нужна цитата из справки, я и так в неё заглядываю прежде чем использовать функцию ;)
Я написал про восстановление т.к в коде у меня сначала получается текущая позиция выделения, а потом происходит восстановление.

Pavluha
26-08-2012, 21:05
Creat0R, тогда есть другие варианты раскрасить текст, при этом не выделяя его?

AZJIO
29-08-2012, 19:45
Скачай сборник скриптов (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. Условия обрамления это уже другой вопрос, но факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее, чем вызывать специальные функции, которые будут выделять текст и ещё сопровождаться мельканием тексты при вызове.

Pavluha
30-08-2012, 19:44
AZJIO, буду значит учить разметку RTF. Твоя идея выглядит очень хорошо, если к этому добавить ещё автообновление раскраски каждые, например, 100 мс.

Pavluha
30-08-2012, 21:35
Ещё небольшой вопрос: как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++

Creat0R
30-08-2012, 22:33
факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее »
Но его придётся обрабатывать в файле я так понял?
Я не нашёл как без записи в файл изменять Stream...

как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++ »
Если как в редакторах, то это совсем не тривиальная задача.
Но есть _GUICtrlRichEdit_SetParaNumbering, которая добавит нумерацию строк внутри элемента.

AZJIO
30-08-2012, 23:17
Я не нашёл как без записи в файл изменять Stream... »
_GUICtrlRichEdit_StreamToVar, _GUICtrlRichEdit_StreamFromVar. А вообще глядя на пример о котором я писал выше, так в нём _GUICtrlRichEdit_SetText вставляет форматированный текст. Хотя так не должно быть, потому что теги должны вставляется как есть. Я, конечно, могу потестить, но мне это не надо...

Твоя идея выглядит очень хорошо, если к этому добавить ещё автообновление раскраски каждые, например, 100 мс. » Не уверен что это хорошая идея. Тестируйте, пробуйте варинаты с добавлением текста (не перезапись всего) и изменение флага модификации _GUICtrlRichEdit_IsModified, который позволит определить изменение текста, а не изменять когда это не требуется.




© OSzone.net 2001-2012