Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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-сайт: neco.pisem.net
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #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.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам