Есть у меня пара утилит, выполняют по расписанию разные действия. Решил дополнить их текстовым полем, в котором бы отображался лог производимых действий.
Для вывода используется richTextBox. Он может принимать массив строк. Т.е. все сводится к формированию этого массива и передаче его в контрол.
Формирую так:
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() + ": произошло событие.");
Для вывода используется richTextBox. Он может принимать массив строк. Т.е. все сводится к формированию этого массива и передаче его в контрол.
Формирую так:
int max_lenght = 500;
{
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. Если нет - то строка дописывается в конец массива, если да - то содержимое массива сдвигается на одно значение а в конец, на освободившееся место, дописывается строка.
Теперь к вопросу, как это использовать. Поскольку таймер создает отдельный поток. то напрямую обратится к форме не получится. Для этого создадим метод:
{
this.Invoke(new Action(() =>
{
richTextBox1.Lines = AddStr(richTextBox1.Lines, text);
richTextBox1.SelectionStart = richTextBox1.TextLength-1;
richTextBox1.ScrollToCaret();
}));
}
Т.е. используем делегат. Чтобы постоянно видеть последние события добавлена перемотка в конец текста.
Ну и само добавление новой строки после этого выглядит так:
addText(DateTime.Now.ToString() + ": произошло событие.");
Комментариев нет:
Отправить комментарий