Страница: 1 |
Вопрос: Реализация подсветки синтаксиса | Добавлено: 11.03.07 05:58 |
Автор вопроса: ![]() |
Реализовал подсветку синтаксиса 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 11.03.07 23:57 |
для начала попробуй всё-таки вместо catch(){} поставить catch(Exception ex){throw ex;}
хто его знает какие косяки ты там пропускаешь ))) зачем вообще там этот блок? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 4 Ответов: 41 |
Профиль | Цитата | #2 | Добавлено: 12.03.07 04:20 |
Он пропускает некоректные записи в БД о подсветки.
Проблема в том, что при изменение текста обновление подсветки происходит медленно, и если есть полоса прокрутки (текст большой) она смещается. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 12.03.07 10:30 |
ну дык конечно медленно - весь текст перекрашивать каждый раз (по крайней мере я так понял).
по-моему надо грести в сторону объектной ориентированности текста - т.е. разбиваешь текст на блоки (типа If'ы, циклы, процедуры), эти блоки на строки и у каждого такого блока и строки должны быть координаты начала и конца (причём это всё как-то должно быть завязано так, чтобы при изменении одного блока, у остальных координаты сдвигались автоматом - т.е. все блоки в связный список должны быть выстроены и координаты вычисляться исходя от координат и размеров предыдущего). Потом заводишь понятие "текущая строка" и "текущий блок" и при редактировании текста, переформатируешь только его. Ну и собсна блоки для интендации, а строки для раскраски. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 4 Ответов: 41 |
Профиль | Цитата | #5 | Добавлено: 12.03.07 13:04 |
Первый столбец - id (не важен), 2 - что подсвечивать, 3 - font_style, 4 - color. |
Страница: 1 |
|