Страница: 1 |
Страница: 1 |
Вопрос: Реализация подсветки синтаксиса
Добавлено: 11.03.07 05:58
Автор вопроса: Dark
Реализовал подсветку синтаксиса XML таким образом:
public partial class frmEdit : Form
{
private bool flag = false;
private struct Highlight_Params
{
public System.Collections.Specialized.StringCollection String;
public System.Collections.Specialized.StringCollection FontStyle;
public System.Collections.Specialized.StringCollection Color;
}
Highlight_Params Hi_Par;
public frmEdit(string DefValue)
{
InitializeComponent();
Value = DefValue;
rtfParam.Text = Value;
LoadHighlightSettings();
HighlightText();
flag = true;
}
public int SelectMyString(string SearchString,int StartPos, RichTextBox rtf)
{
// Determine the starting location of the searchString.
int index = rtf.Text.IndexOf(SearchString, StartPos);
// Determine if the word has been found and select it if it was.
if (index != -1)
{
// Select the string using the index and the length of the string.
rtf.Select(index, SearchString.Length);
}
if (index >= StartPos)
return index + SearchString.Length;
else
return -1;
}
private void HighlightText()
{
int idx,i;
RichTextBox rtf = new RichTextBox();
rtf.Text = rtfParam.Text;
int pos = rtfParam.SelectionStart;
for(i=0;i<Hi_Par.String.Count;i++)
{
idx = 0;
while (idx != -1)
{
try
{
idx = SelectMyString(Hi_Par.String[i], idx,rtf);
rtf.SelectionFont = new Font
(rtf.Font.Name, rtf.Font.Size,
(FontStyle)Enum.Parse(typeof(FontStyle), Hi_Par.FontStyle[i]));
rtf.SelectionColor = Color.FromName(Hi_Par.Color[i]);
rtf.DeselectAll();
}
catch ()
{}
}
}
rtfParam.Rtf = rtf.Rtf;
rtfParam.SelectionStart = pos;
flag = true;
}
private void LoadHighlightSettings(){}
private void rtfParam_TextChanged(object sender, EventArgs e)
{
if (flag)
{
flag = false;
HighlightText();
}
}
}
Метод LoadHighlightSettings() загружает в структуру Hi_Par параметры подсветки из БД, из-за объемности опущен.
Подсветка реализуется в rtfTextBox'е rtfParam
она работает, но как-то криво - при изменении текста начинаются косяки с отображением.
Что требуется исправить, чтобы подсветка работала нормально (например, как в IDE VB 6.0).
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #1
Добавлено: 11.03.07 23:57
для начала попробуй всё-таки вместо catch(){} поставить catch(Exception ex){throw ex;}
хто его знает какие косяки ты там пропускаешь )))
зачем вообще там этот блок?
Номер ответа: 2
Автор ответа:
Dark
Вопросов: 4
Ответов: 41
Профиль | | #2
Добавлено: 12.03.07 04:20
Он пропускает некоректные записи в БД о подсветки.
Проблема в том, что при изменение текста обновление подсветки происходит медленно, и если есть полоса прокрутки (текст большой) она смещается.
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 12.03.07 10:30
ну дык конечно медленно - весь текст перекрашивать каждый раз (по крайней мере я так понял).
по-моему надо грести в сторону объектной ориентированности текста - т.е. разбиваешь текст на блоки (типа If'ы, циклы, процедуры), эти блоки на строки и у каждого такого блока и строки должны быть координаты начала и конца (причём это всё как-то должно быть завязано так, чтобы при изменении одного блока, у остальных координаты сдвигались автоматом - т.е. все блоки в связный список должны быть выстроены и координаты вычисляться исходя от координат и размеров предыдущего). Потом заводишь понятие "текущая строка" и "текущий блок" и при редактировании текста, переформатируешь только его. Ну и собсна блоки для интендации, а строки для раскраски.
Номер ответа: 4
Автор ответа:
Dark
Вопросов: 4
Ответов: 41
Профиль | | #4
Добавлено: 12.03.07 13:02
Мне не требуется настолько навороченная подсветка: мне достаточно, чтобы по совпадению с записью в БД текст выделялся. Эта подсветка используется для облегчения правки параметров в XML-формате, хранящихся в БД. Это не среда разработки. Пример записей о подсветки из БД:
9 <SOAP-ENC:Array> Bold Black
10 <SOAP-ENC:Array Bold Black
1 < Bold Red
2 > Bold Red
3 <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> Italic LightGray
5 <SOAP-ENV:Body> Italic LightGray
6 </SOAP-ENC:Array> Bold Black
7 </SOAP-ENV:Body> Italic LightGray
8 </SOAP-ENV:Envelope> Italic LightGray
Номер ответа: 5
Автор ответа:
Dark
Вопросов: 4
Ответов: 41
Профиль | | #5
Добавлено: 12.03.07 13:04
Первый столбец - id (не важен), 2 - что подсвечивать, 3 - font_style, 4 - color.