четверг, 19 апреля 2012 г.

Отображение лога событий на форме.

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

    Для вывода используется richTextBox. Он может принимать массив строк. Т.е. все сводится к формированию этого массива  и передаче его в контрол.

    Формирую так:


int max_lenght = 500;


 private string[] AddStr(string[] Lines, string value)
        {
           
            string[] result = new string[lenghtResult(Lines)];
           
            int i;
            if (Lines.Length < max_lenght)
            {
               
                for (i = 0; i < Lines.Length; i=i+1 )
                {
                    result[i] = Lines[i];

                }
                result[Lines.Length] = value;
           
            }


            if (Lines.Length >= max_lenght)
            {
                for (i = 0; i < max_lenght-1; i = i + 1)
                {
                    result[i] = Lines[i + 1];

                }
                result[max_lenght-1] = value;
            }

           
           
           
            return result;
               
        }


        private int lenghtResult(string[] Lines)
        {
            int res=0;
            if(Lines.Length<max_lenght)
            {
                res = Lines.Length + 1;
            }
            if (Lines.Length >= max_lenght)
            {
                res = max_lenght;
            }


            return res;
       
        }


   Что делает этот код: в AddStr передается текущий массив строк и та строка, которую нужно добавить. Определяется, достиг ли массив предельного разрешенного значения max_lenght. Если нет - то строка дописывается в конец массива, если да - то содержимое массива сдвигается на одно значение а в конец, на освободившееся место, дописывается строка.
    Теперь к вопросу, как это использовать. Поскольку таймер создает отдельный поток. то напрямую обратится к форме не получится. Для этого создадим метод:


        public void addText(string text)
        {

            this.Invoke(new Action(() =>
            {
                richTextBox1.Lines = AddStr(richTextBox1.Lines, text);
                richTextBox1.SelectionStart = richTextBox1.TextLength-1;
                richTextBox1.ScrollToCaret();
            }));

       
        }

    Т.е. используем делегат. Чтобы постоянно видеть последние события добавлена перемотка в конец текста.

Ну и само добавление новой строки после этого выглядит так:

addText(DateTime.Now.ToString() + ": произошло событие.");


Похожие посты:

Комментариев нет:

Отправить комментарий