Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Как реализовать подсветку кода? (http://forum.oszone.net/showthread.php?t=241335)

Pavluha 25-08-2012 18:11 1976868

Как реализовать подсветку кода?
 
Здравствуйте. В поле edit находиться текст с bb тегами. Нужно подсветить определённые теги определённым стилем (например, тег [IMG][/IMG] сдалать зелёным, а тег [b][/b] сделать жирным). Вопрос: как это реализовать. Подскажите пожалуйста. Заранее спасибо.

Creat0R 25-08-2012 19:38 1976909

Нужно использовать RichEdit.
Вывод текста в элемент RichEdit с поддержкой тегов

Pavluha 25-08-2012 20:54 1976940

Creat0R, а можно сделать так, чтобы в примере, на который вы дали ссылку, теги не убирались.

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

Creat0R 26-08-2012 00:33 1977041

Pavluha,
Всё возможно.
См. описание к функциям _GUICtrlRichEdit_* в справке.

Creat0R 26-08-2012 02:00 1977067

Как то так:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>

$sEditText = ''

$hGUI = GUICreate("Test Script", 300, 200)

$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with tags  [img][/img], [b][/b], and more.', 20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))

GUISetState(@SW_SHOW, $hGUI)

AdlibRegister('_SetEdit', 100)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GUICtrlRichEdit_Destroy($hRichEdit)
            Exit
    EndSwitch
WEnd

Func _SetEdit()
    $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
    $sData = _GUICtrlRichEdit_GetText($hRichEdit)

    If $sEditText <> $sData Then
        $sEditText = $sData
    Else
        Return
    EndIf

    _GUICtrlRichEdit_SetReadOnly($hRichEdit, True)

    Dim $aTags[2][3] = [['[b][/b]', 'bo', 0x000000], ['[img][/img]', '', 0x0FFF00]]

    For $i = 0 To UBound($aTags)-1
        StringReplace($sData, $aTags[$i][0], '')
        $iC = @extended

        For $j = 1 To $iC
            $iPos = StringInStr($sData, $aTags[$i][0], 2, $j)
            _GUICtrlRichEdit_SetSel($hRichEdit, $iPos-1, $iPos + StringLen($aTags[$i][0])-1)

            If $iPos Then
                If $aTags[$i][1] <> '' Then
                    _GUICtrlRichEdit_SetCharAttributes($hRichEdit, '+' & $aTags[$i][1])
                EndIf

                _GUICtrlRichEdit_SetCharColor($hRichEdit, $aTags[$i][2])
            EndIf
        Next

        _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
        _GUICtrlRichEdit_SetCharAttributes($hRichEdit, '-' & $aTags[$i][1])
        ;_GUICtrlRichEdit_SetCharColor($hRichEdit, Default)
    Next

    _GUICtrlRichEdit_SetReadOnly($hRichEdit, False)
EndFunc


Pavluha 26-08-2012 11:42 1977136

Creat0R, спасибо ещё раз, правда в вашем коде есть ошибочка ([b]some text[/b] не выделяет), но я это исправлю сам.

Creat0R 26-08-2012 12:23 1977149

Цитата:

Цитата Pavluha
в вашем коде есть ошибочка (some text не выделяет) »

Это не ошибка, я не рассчитывал на это.
В первом сообщении указано «тег сдаелать зелёным, а тег сделать жирным», с этого я понял что теги идут вместе, не обрамляя текст.

Исправить можно так:
Код:

    ...
    Dim $aTags[4][3] = [['[b]', 'bo', 0x000000], ['[/b]', 'bo', 0x000000], ['[img]', '', 0x0FFF00], ['[/img]', '', 0x0FFF00]]
    ...

хотя содержимое между тегами не будет подсвечиваться.

Pavluha 26-08-2012 12:42 1977156

Creat0R, я заметил, что если текста в поле очень много, то создаётся ненужная прокрутка текста (попробуйте написать текста столько, что он уже не вместиться весь и появиться прокрутка). Как это исправить.

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

Creat0R 26-08-2012 13:37 1977182

Цитата:

Цитата Pavluha
Как это исправить »

Убрать $WS_VSCROLL из стилей элемента.

Цитата:

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

Pavluha 26-08-2012 13:58 1977189

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

Creat0R 26-08-2012 14:34 1977217

Цитата:

Цитата Pavluha
когда текста слишком много, а ты допечатываешь, то текст сам по себе прокручивается от начала до конца »

У меня не прокручивается.

Цитата:

Цитата Pavluha
это из-за функции _GUICtrlRichEdit_SetSel »

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

Pavluha 26-08-2012 17:27 1977299

Creat0R, http://autoit-script.ru/autoit3_docs...dit_setsel.htm

Цитата:

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

Pavluha 26-08-2012 17:55 1977309

Цитата:

Цитата Creat0R
У меня не прокручивается. »

возьмите строк так 1000 или больше, и поглядите.

Creat0R 26-08-2012 20:18 1977378

Цитата:

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

Мне не нужна цитата из справки, я и так в неё заглядываю прежде чем использовать функцию ;)
Я написал про восстановление т.к в коде у меня сначала получается текущая позиция выделения, а потом происходит восстановление.

Pavluha 26-08-2012 21:05 1977388

Creat0R, тогда есть другие варианты раскрасить текст, при этом не выделяя его?

AZJIO 29-08-2012 19:45 1979428

Скачай сборник скриптов, сделай поиск файла RESH_Mod_Example.au3. Это упрощённый аналог RESHv2.2 от Beege. Я хотел выяснить как делается подсветка и упростил скрипт до минимума. Смысл такой: функции _GUICtrlRichEdit_Stream... работают с данными как бы в сыром режиме. Это как HTML, который мы видим как текст, на самом деле в это текстовый файл, где слова обрамлены тегами. Аналогично и здесь, в "шапке" файла заданы стили, далее по тексту идут теги. Задача обрамить текст тегами и вставить в RichEdit. Условия обрамления это уже другой вопрос, но факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее, чем вызывать специальные функции, которые будут выделять текст и ещё сопровождаться мельканием тексты при вызове.

Pavluha 30-08-2012 19:44 1980081

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

Pavluha 30-08-2012 21:35 1980136

Ещё небольшой вопрос: как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++

Creat0R 30-08-2012 22:33 1980178

Цитата:

Цитата AZJIO
факт тот, что обрабатывать текст перед вставкой получается гораздо быстрее »

Но его придётся обрабатывать в файле я так понял?
Я не нашёл как без записи в файл изменять Stream...

Цитата:

Цитата Pavluha
как сделать так, чтобы слева показывало номера строк, как в редакторе notepad++ »

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

AZJIO 30-08-2012 23:17 1980193

Цитата:

Цитата Creat0R
Я не нашёл как без записи в файл изменять Stream... »

_GUICtrlRichEdit_StreamToVar, _GUICtrlRichEdit_StreamFromVar. А вообще глядя на пример о котором я писал выше, так в нём _GUICtrlRichEdit_SetText вставляет форматированный текст. Хотя так не должно быть, потому что теги должны вставляется как есть. Я, конечно, могу потестить, но мне это не надо...

Цитата:

Цитата Pavluha
Твоя идея выглядит очень хорошо, если к этому добавить ещё автообновление раскраски каждые, например, 100 мс. »

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

Creat0R 30-08-2012 23:55 1980208

Цитата:

Цитата AZJIO
_GUICtrlRichEdit_StreamToVar, _GUICtrlRichEdit_StreamFromVar »

Это не отвечает на вопрос как менять Stream, т.е как обращаться к его содержимому?
Немного ошибся с описанием функции.

Но всё равно работать с файлом легче, не добавляются лишние теги.

Creat0R 31-08-2012 02:56 1980245

Вот так получилось:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>

Global $sStream_File = @TempDir & '\au3_rtf.tmp'

$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)

$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with [img]image[/img] tags, [b]bold[/b], and [color]color[/color].', 20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)

GUISetState(@SW_SHOW, $hGUI)

While 1
        _GUICtrlRichEdit_SetFormat()
       
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        _GUICtrlRichEdit_Destroy($hRichEdit)
                        FileDelete($sStream_File)
                        Exit
        EndSwitch
WEnd

Func _GUICtrlRichEdit_SetFormat()
        If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
                Return
        EndIf
       
        Local $aPos, $sRead, $sColorTbl
       
        _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
        $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
        $sRead = FileRead($sStream_File)
       
        $sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255' ;red(cf1;green(cf2);blue(cf3)
        Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2'], ['color', '', '\cf1']]
       
        For $i = 0 To UBound($aTags) - 1
                $sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{\' & $aTags[$i][1] & '\' & $aTags[$i][2] & ' \1}')
        Next
       
        $sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
       
        $hFile = FileOpen($sStream_File, 2)
        FileWrite($hFile, $sRead)
        FileClose($hFile)
       
        _GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
        _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
        _GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc


Pavluha 01-09-2012 13:37 1981072

ещё вопросик: а как изменить фон определённых слов?

Creat0R 03-09-2012 03:32 1981945

Цитата:

Цитата Pavluha
как изменить фон определённых слов? »

По идее нужно использовать \cbN как параметр рядом с cfN, но оно почему то не работает...

Pavluha 05-09-2012 22:33 1983811

Creat0R, вот-вот. я сделал документ в ворде с фоном, сохранил в формате ртф, работает, даже в вордпэде правильно показывает. открываю я исходный код, а там....... короче я не разобрался. но фон ооочень нужен. без него нормальную подсветку не сделаешь.

Pavluha 12-09-2012 18:42 1987505

Ура!!! Нашёл!!!

Код:

{\rtf1
{\colortbl ;\red255\green255\blue0;}
some
{\highlight1 yellow }
text
}


Pavluha 13-09-2012 21:06 1988199

Ещё вопрос (не обязательно, но всё же): нужно сделать так, чтобы подсвечивались url и при нажатии на них (например, ctrl + нажатие или, например, двойной клик по ссылке) открывалась страница с этим url. _GUICtrlRichEdit_AutoDetectURL ($hRichEdit, True) только подсвечивает.

Creat0R 13-09-2012 23:05 1988296

Цитата:

Цитата Pavluha
_GUICtrlRichEdit_AutoDetectURL ($hRichEdit, True) только подсвечивает. »

Нужно ещё отлавливать событие:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>

Global $sStream_File = @TempDir & '\au3_rtf.tmp'

$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)

$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with [img]image[/img] tags, [b]bold[/b], and [color]color[/color].' & @LF & @LF & 'http://autoitscript.com', _
        20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
       
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)

GUISetState(@SW_SHOW, $hGUI)

While 1
        _GUICtrlRichEdit_SetFormat()
       
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        _GUICtrlRichEdit_Destroy($hRichEdit)
                        FileDelete($sStream_File)
                        Exit
        EndSwitch
WEnd

Func _GUICtrlRichEdit_SetFormat()
        If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
                Return
        EndIf
       
        Local $aPos, $sRead, $sColorTbl
       
        _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
        $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
        $sRead = FileRead($sStream_File)
       
        $sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255;\red255\green255\blue0' ;red(cf1;green(cf2);blue(cf3);yellow(cf4)
        Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2 \highlight4'], ['color', '', '\cf1']]
       
        For $i = 0 To UBound($aTags) - 1
                $sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{' & StringReplace($aTags[$i][1] & $aTags[$i][2], '\', '\\') & ' \1}')
                ;$sRead = StringRegExpReplace($sRead, '\[url=(.*?)\](.*?)\[/url\]', '{\\field{\\*\\fldinst{HYPERLINK "\1"}}{\\fldrslt{\\cf3 \\ul \2}}}')
        Next
       
        $sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
       
        $hFile = FileOpen($sStream_File, 2)
        FileWrite($hFile, $sRead)
        FileClose($hFile)
       
        _GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
        _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
        _GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
        #forceref $hWnd, $iMsg, $iWparam
       
        Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
       
        $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
       
        Switch $hWndFrom
                Case $hRichEdit
                        Select
                                Case $iCode = $EN_LINK
                                        $tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
                                       
                                        If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
                                                $tEnLink = DllStructCreate($tagENLINK, $iLparam)
                                                $cpMin = DllStructGetData($tEnLink, "cpMin")
                                                $cpMax = DllStructGetData($tEnLink, "cpMax")
                                               
                                                ShellExecute(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
                                        EndIf
                        EndSelect
        EndSwitch
       
        Return $GUI_RUNDEFMSG
EndFunc


Pavluha 14-09-2012 19:47 1988775

Creat0R, если ссылка находится в каком-либо теге, то она не подсвечивается, а ведь должна.

Creat0R 15-09-2012 05:48 1988964

Цитата:

Цитата Pavluha
если ссылка находится в каком-либо теге, то она не подсвечивается »

Пример текста можно?

Pavluha 15-09-2012 23:55 1989344

Код:

Some data with [img]http://google.ru/asd.png[/img] tags, [b]bold[/b], and [color]color[/color].

http://autoitscript.com

http://google.ru/asd.png не подсвечивается

Creat0R 16-09-2012 00:41 1989359

Цитата:

Цитата Pavluha
http://google.ru/asd.png не подсвечивается »

Потому что ссылка определяется по началу слова (с http://), если поставить пробел до и после ссылки, то будет подсвечивать.

Я думал что подсветку ссылки можно будет делать через тег HYPERLINK (см. комментированную строчку в цикле перебора тегов), но у меня это не получилось.

Creat0R 16-09-2012 01:14 1989370

Есть два варианта.
Либо определять текст только между тегами, либо вне тегов (как и сделано выше).
Конечно можно попытаться извернуться и построить рег. выражение чтобы определял в обеих случаях, но у меня это пока не получилось.

Вот тот же пример но со вторым вариантом:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>

Global $sStream_File = @TempDir & '\au3_rtf.tmp'

$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)

$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with [img]http://google.ru/asd.png[/img] tags, [b]bold[/b], and [color]color[/color].', _
        20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
       
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

;_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)

GUISetState(@SW_SHOW, $hGUI)

While 1
        _GUICtrlRichEdit_SetFormat()
       
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        _GUICtrlRichEdit_Destroy($hRichEdit)
                        FileDelete($sStream_File)
                        Exit
        EndSwitch
WEnd

Func _GUICtrlRichEdit_SetFormat()
        If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
                Return
        EndIf
       
        Local $aPos, $sRead, $sColorTbl
       
        _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
        $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
        $sRead = FileRead($sStream_File)
       
        $sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255;\red255\green255\blue0' ;red(cf1;green(cf2);blue(cf3);yellow(cf4)
        Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2 \highlight4'], ['color', '', '\cf1']]
       
        For $i = 0 To UBound($aTags) - 1
                $sRead = StringRegExpReplace($sRead, '\[(.+?)\](http://.*?)\[/\1\]', '[\1]{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}[/\1]')
               
                ;Попытка добавить определение ссылок вне тега (вызывает проблемы при добавлении символа пробела или " после или до ссылки)
                ;$sRead = StringRegExpReplace($sRead, '([^" ])(http://.*)([^"}]*)', '\1{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}\3')
               
                $sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{' & StringReplace($aTags[$i][1] & $aTags[$i][2], '\', '\\') & ' \1}')
        Next
       
        $sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
       
        $hFile = FileOpen($sStream_File, 2)
        FileWrite($hFile, $sRead)
        FileClose($hFile)
       
        _GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
        _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
        _GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
        #forceref $hWnd, $iMsg, $iWparam
       
        Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
       
        $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
       
        Switch $hWndFrom
                Case $hRichEdit
                        Select
                                Case $iCode = $EN_LINK
                                        $tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
                                       
                                        If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
                                                $tEnLink = DllStructCreate($tagENLINK, $iLparam)
                                                $cpMin = DllStructGetData($tEnLink, "cpMin")
                                                $cpMax = DllStructGetData($tEnLink, "cpMax")
                                               
                                                ShellExecute(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
                                        EndIf
                        EndSelect
        EndSwitch
       
        Return $GUI_RUNDEFMSG
EndFunc


Pavluha 16-09-2012 17:37 1989711

Creat0R, тогда хотя бы сделайте так, чтобы подсвечивались ссылки только в двух тегах: в [img]http://link[/img] и [url]http://link[/url], а также [url=http://link]some text[/url]

Creat0R 16-09-2012 19:00 1989786

Код:

$sRead = StringRegExpReplace($sRead, '(\[img\]|\[url=|\[url\])(http://.*?)(\[/img\]|\].*?\[/url\]|\[/url\])', '\1{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}\3')

Pavluha 19-09-2012 10:56 1991352

Creat0R, можно ещё вопрос (на этот раз серьёзный): у меня пропадают некоторые русские буквы в вашем коде (только что заметил, что во всех кодах они пропадают). это из-за функции _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File) . я поменял эту строчку на $sRead = _GUICtrlRichEdit_GetText ($hRichEdit) и закомметировал $sRead = FileRead($sStream_File), всё стало норм, правда знаки переноса строки пропадают. Как сделать так, чтобы ничего не пропадало?

Creat0R 19-09-2012 11:59 1991378

Цитата:

Цитата Pavluha
пропадают некоторые русские буквы в вашем коде (только что заметил, что во всех кодах они пропадают). это из-за функции _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File) »

Да, нужно её поправить, в ней файл пишется в обычной кодировке:

Код:

...

__GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)


...

Func __GUICtrlRichEdit_StreamToFile($hWnd, $sFilespec, $fIncludeCOM = True, $iOpts = 0, $iCodePage = 0)
        If Not _WinAPI_IsClassName($hWnd, $_GRE_sRTFClassName) Then Return SetError(101, 0, False)

        Local $iWparam
        If StringRight($sFilespec, 4) = ".rtf" Then
                $iWparam = _Iif($fIncludeCOM, $SF_RTF, $SF_RTFNOOBJS)
        Else
                $iWparam = _Iif($fIncludeCOM, $SF_TEXTIZED, $SF_TEXT)
                If BitAND($iOpts, $SFF_PLAINRTF) Then Return SetError(1041, 0, False)
        EndIf
        ; only opts are $SFF_PLAINRTF and $SF_UNICODE
        If BitAND($iOpts, BitNOT(BitOR($SFF_PLAINRTF, $SF_UNICODE))) Then Return SetError(1042, 0, False)
        If BitAND($iOpts, $SF_UNICODE) Then
                If Not BitAND($iWparam, $SF_TEXT) Then Return SetError(1043, 0, False)
        EndIf

        If _GUICtrlRichEdit_IsTextSelected($hWnd) Then $iWparam = BitOR($iWparam, $SFF_SELECTION)

        $iWparam = BitOR($iWparam, $iOpts)
        If $iCodePage <> 0 Then
                $iWparam = BitOR($iWparam, $SF_USECODEPAGE, BitShift($iCodePage, -16))
        EndIf
        Local $tEditStream = DllStructCreate($tagEDITSTREAM)
        DllStructSetData($tEditStream, "pfnCallback", DllCallbackGetPtr($_GRC_StreamToFileCallback))
        Local $hFile = FileOpen($sFilespec, 2+128) ; overwrite
        If $hFile - 1 Then Return SetError(102, 0, False)

        DllStructSetData($tEditStream, "dwCookie", $hFile) ; -> Send handle to CallbackFunc
        _SendMessage($hWnd, $EM_STREAMOUT, $iWparam, $tEditStream, 0, "wparam", "struct*")
        FileClose($hFile)
        Local $iError = DllStructGetData($tEditStream, "dwError")
        If $iError <> 0 Then SetError(700, $iError, False)
        Return True
EndFunc

Цитата:

Цитата Pavluha
всё стало норм, правда знаки переноса строки пропадают. Как сделать так, чтобы ничего не пропадало? »

Добавить параметр $fCrToCrLf:
Код:

$sRead = _GUICtrlRichEdit_GetText($hRichEdit, True)

Pavluha 20-09-2012 20:42 1992231

Creat0R, вопрос: а какая из данных функций работает быстрее?

Creat0R 21-09-2012 00:57 1992347

Цитата:

Цитата Pavluha
какая из данных функций работает быстрее? »

Вопрос не что быстрее, а что надёжнее, думаю первое (через Stream).

AZJIO 21-09-2012 10:55 1992460

Pavluha, посмотри это http://www.autoit.de/index.php?page=...threadID=25947


Время: 01:33.

Время: 01:33.
© OSzone.net 2001-