Обработка исключений
Прерывания, рассматриваемые в данном параграфе, относятся к классу внутренних прерываний и называются исключениями (exception). Они происходят синхронно выполнению программы и возникают при появлении аварийной ситуации в ходе исполнения некоторой инструкции. Примерами исключений являются деление на нуль, переполнение, обращение к несуществующему файлу и т.д.
Обработка ошибок представляет собой важную проблему для любого языка программирования. Платформа .NET предлагает объект Exception, наследующий от класса System.Exception, обеспечивающий программистов стандартным механизмом обработки исключений.
Обработчик ошибок в Visual C# использует блок Try...Catch...Finally. Слово Try переводится как «попробуй», Catch — «поймай». Этот блок должен окружать ту часть кода, где может возникнуть исключительная ситуация. В начале блока стоит оператор Try. Блок кода Catch располагается там, где мы определяем, какие типы ошибок следует искать. Блок Finally всегда исполняется и содержит подпрограммы освобождения ресурсов для исключительных ситуаций.
В листинге 16 мы окружили весь код, где возможно возникновение ошибки, блоком Try...Catch. Приведенный блок содержит один оператор Catch, который перехватывает конкретную ошибку переполнения, возникающую вследствие деления на нуль.
Листинг 16
namespace WindowsApplicationl {
public partial class Forml : Form
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
int a = Convert.ToIntl6(textBoxl.Text); int b = Convert.ToIntl6(textBox2.Text); try {
//Вызов ошибки "Деление на нуль" float с = а / Ь;
//перехват ошибки
}
catch (DivideByZeroException)
{
MessageBox.Show("Произошла ошибка деления на нуль ");
}
}
}
}
Предположим а = 5, Ь = 0. При выполнении этого кода появится сообщение, представленное на рис. 20.

Рис. 20. Сообщение об ошибке
Код, содержащийся в листинге 17, перехватит другую ошибку, связанную на этот раз с неверным форматом ввода. Поскольку обработка исключений должна начинаться непосредственно после оператора try, его мы переносим до начала ввода данных.
Листинг 17
namespace WindowsApplicationl
{
public partial class Forml : Form
{
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
try
{
int a = Convert.ToIntl6(textBoxl.Text); int b = Convert.ToIntl6(textBox2.Text); float c = a / b;
}
catch (DivideByZeroException)
{
MessageBox.Show("Произошла ошибка деления на нуль ");
}
catch (FormatException) //неправильный формат ввода
{
MessageBox.Show("Неправильный формат ввода ");
}
}
}
}
Предположим а = 5е 1 (а описана как целочисленная переменная), b = 1. При выполнении программы появится сообщение, представленное на рис. 21.

Неправильным формат ввода
Рис. 21. Сообщение об ошибке
Код, содержащийся в листинге 18, перехватит ошибку, связанную с отсутствием данных в текстовых окнах textBoxl и textBox2.
Листинг 18
namespace WindowsApplicationl
{
public partial class Forml : Form
{
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
try
{
int a = Convert.ToIntl6(textBoxl.Text); int b = Convert.ToIntl6(textBox2.Text); float c = a / b;
}
catch (DivideByZeroException)
{
MessageBox.Show("Произошла ошибка деления на нуль ");
}
catch
{if ((textBoxl.Text =="") || (textBox2.Text ==""))
MessageBox.Show("Вы не ввели данные");
}
}
}
}
Итак, предположим, что текстовые поля, предназначенные для ввода, остаются незаполненными. При выполнении программы появится сообщение, представленное на рис. 22.

Рис. 22. Сообщение об ошибке
Обработка последовательностей данных
В предыдущих параграфах мы рассмотрели методы ввода и вывода данных, используемые в языке программирования Visual С#. Решение о том, какой из способов применять на практике, принимает пользователь. Скорее всего, свое решение он будет принимать в соответствии с классом решаемой задачи. Например, в следующей задаче, где будет осуществлен ввод последовательности данных, уместно использовать функцию InputBox.
Задача. Разработайте программу, с помощью которой осуществляется ввод пяти целых чисел. Найдите количество отрицательных чисел и их сумму. Результат выведите в окно сообщения. В листинге 19 представлен код процедуры.
Листинг 19
namespace WindowsApplicationl {
public partial class Forml : Form {
public Forml()
{
InitializeComponent();
}
private void Forml_Load(object sender, EventArgs e)
{
int s = 0;
int kolotr = 0;
for (int i = 1; i <= 5; i++)
{
string a =
Microsoft.VisualBasic.Interaction.InputBox("Введите число", "Заголовок
окна", -1, -1);
int chislo = Convert.Tolntl?(a); if (chislo < 0)
{
kolotr = kolotr + 1; s = s + chislo;
}
}
MessageBox.Show("Сумма отрицательных чисел=" + s.ToString("n"), "Заголовок окна", MessageBoxButtons.OK,
MessageBoxIcon.Information);
MessageBox.Show("Количество отрицательных чисел=" + kolotr.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
}
Окончательная настройка приложения
После того как программа отлажена, необходимо выполнить ее окончательную настройку, т.е. задать название программы и выбрать значок, который будет изображать исполняемый файл приложения в папке или на рабочем столе, а также на панели задач во время работы программы.
Хороший стиль программирования предполагает отводить для каждого нового проекта новый подкаталог (папку). Если размещать несколько проектов в один каталог, то программист, возможно, скоро запутается в том, какие файлы к какому проекту относятся.
В состав Microsoft Visual Studio 2012 входит программа Редактор изображений (Image Editor), при помощи которой программист может создать для своего приложения уникальный значок. Запускается Редактор изображений выбором соответствующей команды из меню Project / Add New Item / Icon File.
В окне Проводника решений появляется файл Iconl.ico. Для рисования следует воспользоваться панелью инструментов со стандартным набором инструментов. Аналогичная панель находится в меню Image.
Созданную иконку можно сохранить в папке текущего проекта, если выбрать пункт меню File / Save Iconl.ico As...
Назначить иконку текущему проекту нужно следующим образом: выбрать пункт меню Project / Имя проекта Properties / Application / Icon.
Кроме иконок пользователь может создавать картинки в формате BMP, выбрав в окне Add New Item пункт Bitmap File.
Окончательная компоновка приложения состоит в создании .ехе файла. Проект сохраняется, затем выбирается меню Build / Build Имя проекта. Созданный .ехе файл можно найти в текущем каталоге проекта, например Запись выражений / папка Bin / папка Release.
Организация взаимодействия форм
Допустим, в текущем проекте существует одна форма, которую будем называть Главной формой. Создадим кнопку Переход на вторую форму. Для того чтобы добавить новую форму, выполним команду: Project / Add Windows Form. Теперь в проекте существуют две формы с именами Forml (Главная) и Form2 (Подчиненная).
Напишем код процедуры (см. листинг 20) для кнопки Переход на вторую форму. Листинг 20
namespace WindowsApplicationl {
public partial class Forml : Form {
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
Form2 f=new Form2();
this.Hide();
}
}
}
Таким образом, мы создали главное окно, которое вызывает дочернее в виде модального окна. Что значит «модальное»? Это значит, что управление полностью передается ему. Как только программа встречает код процедуры private void buttonl_Click(object sender, EventArgs e), работа главной формы останавливается, и управление полностью передается дочерней форме. Пока модальное окно не закроется, главная форма работать не будет.
Теперь запрограммируем переход со второй формы на первую. Добавим на подчиненную форму кнопку Переход на первую форму.
Напишем код процедуры (см. листинг 21) для кнопки Переход на первую форму.
Листинг 21
namespace WindowsApplicationl {
public partial class Form2 : Form {
public Form2()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
Forml f = new Forml(); this.Hide(); f.ShowDialog();
}
}
}
Для того чтобы закончить работу приложения, состоящего из нескольких форм, на второй форме создадим кнопку Выход и напишем следующий код процедуры.
Листинг 22
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
Работа с компонентами
В языке программирования Visual C# имеется обширный набор встроенных элементов управления. Используя этот набор и редактор форм, можно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. Элементы управления являются объектами, поэтому, как любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели ToolBox (Окно инструментов). Ее внешний вид представлен на рис. 23.
Toolbox
+ All Windows Forms + Common Controls + Containers + Menus & Toolbars + Data
+ Components + Printing + Dialogs + Crystal Reports - General
Рис. 23. Палитра инструментов
В рамках учебного пособия рассматривается небольшая часть доступных для пользователя компонентов.
Кнопка (Button)
В основном используется для инициирования выполнения некоторых действий, вызываемых нажатием кнопки I ^ I. Таким образом, основным событием, связанным с кнопкой, является событие button_CIick. Кнопка характеризуется размером, текстом заголовка, цветом фона и т.д. Наиболее часто используемые свойства компонента Button представлены в табл. 12.
Таблица 12. Основные свойства компонента Button_
Свойство |
Описание |
Enabled |
Доступность кнопки |
Font |
Шрифт, используемый для отображения текста на кнопке |
Image |
Позволяет вывести картинку на поверхность кнопки |
Name |
Имя компонента |
Text |
Текст на кнопке |
TextAlign |
Положение текста на кнопке |
Надпись (Label)
D
Элемент управления Надпись аЬе11 используется для отображения надписей. Наиболее часто используемые свойства компонента Label представлены в табл. 13.
Таблица 13. Основные свойства компонента Label_
Свойство |
Описание |
BorderStyle |
Вид рамки компонента |
Font |
Шрифт, используемый для отображения текста |
ForeColor |
Цвет текста |
Name |
Имя компонента |
Text |
Текст надписи |
TextAlign |
Выравнивание текста в поле компонента |
Поле ввода (TextBox)
J ?L
р
В основном объект TextBox
используется для ввода пользователем текста, который используется в программе, или для вывода в него результатов расчетов программы. Текст, введенный в поле ввода, в программе обычно преобразу-
ется либо в число, либо в формулу, либо его формат не меняется. Наиболее часто используемые свойства компонента Тех1Вох представлены в табл. 14.
Таблица 14. Основные свойства компонента TextBox
Свойство |
Описание |
BackColor |
Цвет фона поля компонента |
BorderStyle |
Вид рамки компонента |
Font |
Шрифт, используемый для отображения текста в поле компонента |
ForeColor |
Цвет текста |
Lines |
Массив строк, элементы которого содержат текст, находящийся в поле редактирования, если компонент находится в режиме МиШЦте. Строки нумеруются с нуля |
MaxLength |
Максимальное количество символов, которое пользователь может ввести. Если оно равно 0, то пользователь может ввести текст неограниченной длины |
MultiLine |
Разрешает или запрещает ввод нескольких строк текста |
Name |
Имя компонента |
PasswordChar |
Указанный в этом свойстве символ отображается вместо каждого символа текста. Применяется для ввода пароля |
Readonly |
Если равно значению Тгие, то пользователь не сможет изменить текст в текстовом окне |
ScrollBars |
Задает полосы прокрутки |
TextAlign |
Выравнивание текста в поле компонента |
Работу с объектами Button, Label и TextBox рассмотрим на примере
использования текстового окна для ввода пароля.
Текстовое окно, как видно из табл. 14, характеризуется двумя свойствами, позволяющими применять их при создании полей, предназначаемых для ввода пароля. PasswordChar — задает символ, отображаемый в поле вместо вводимых символов, MaxLength — определяет максимальное количество символов, вводимых в окно, поэтому рекомендуется использовать их в данной программе.
В следующем примере (см. листинг 23) пароль необходимо ввести в течение 15 секунд. Для этого значение свойства Interval элемента управления timerl следует выставить в 15 000.
Листинг 23
namespace WindowsApplicationl {
public partial class Forml : Form {
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
if ( textBoxl.Text == "1") //пароль в данной программе - 1 {
this.timerl.Stop();
MessageBox.Show("Добро пожаловать в программу "
,"Заголовок окна",MessageBoxButtons.OK,MessageBoxIcon.Information);
Form2 f=new Form2(); this.Hide(); f.ShowDialog();
}
else MessageBox.Show("Введен неправильный пароль "
,"Заголовок окна",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
private void timerl_Tick(object sender, EventArgs e)
{
MessageBox.Show("Время истекло " ,"Окно ввода пароля",MessageBoxButtons.OK,MessageBoxIcon.Information);
Application.Exit();
}
private void Forml_Load(object sender, EventArgs e)
{
this.timerl.Start();
}
}
}
Флажок (CheckBox)
С помощью флажков пользователь выбирает один или несколько элементов из предложенных ему альтернатив. Наиболее часто используемые свойства компонента CheckBox представлены в табл. 15.
Таблица 15. Основные свойства компонента CheckBox
Свойство |
Описание |
CheckAlign |
Положение кнопки в поле компонента |
Chicked |
Состояние переключателя, если переключатель выбран, то значение свойства равно True |
Enabled |
Доступность переключателя |
Image |
Позволяет вывести картинку на поверхность компонента |
Text |
Текст надписи, находящийся справа от компонента |
TextAlign |
Выравнивание текста в поле компонента |

Рис. 24. Пример приложения с флажками
Разработаем приложение, использующее флажки. Внешний вид приложения представлен на рис. 24.
Вопрос теста выведен в текстовое окно (Тех1Вох1). Некоторые свойства компонента следует изменить:
MultiLine = True Readonly = True TabStop = False
Выбрав свойство Lines, получаем доступ к окну редактора (рис. 25) и вводим текст вопроса.
В данном примере заблокирован переход к следующему вопросу, если пользователь не отметил ни один пункт ответа и нажал кнопку Ок. Сообщение показано на рис. 26.

Рис. 25. Окно редактора

Рис. 26. Сообщение
Код процедуры представлен в листинге 24.
Листинг 24
namespace WindowsApplicationl {
public partial class Forml : Form {
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
if ((! checkBoxl.Checked) && (! checkBox2.Checked) && (! checkBox3.Checked) && (! checkBox4.Checked))
MessageBox.Show("Надо ответить на вопрос !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
if ((! checkBoxl.Checked) && (! checkBox2.Checked) &&
(checkBox3.Checked) && (checkBox4.Checked))
{
MessageBox.Show("Вы ответили правильно !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show("Переходим к следующему вопросу !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
checkBoxl.Enabled = false checkBox2.Enabled = false checkBox3.Enabled = false checkBox4.Enabled = false
}
else
{
MessageBox.Show("Вы ответили неправильно !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
checkBoxl.Enabled = false checkBox2.Enabled = false checkBox3.Enabled = false checkBox4.Enabled = false
}
}
}
}
Переключатель (RadioButton)
В отличие от флажков, позволяющих пользователю выбрать один или несколько вариантов, переключатели позволяют выбрать только один из предложенных вариантов. Наиболее часто используемые свойства компонента RadioButton представлены в табл. 16.
Таблица 16. Основные свойства компонента RadioButton
Свойство |
Описание |
Checked |
Определяет внешний вид кнопки |
Enabled |
Доступность кнопки |
Text |
Текст надписи, находящийся справа от компонента |
TextAlign |
Выравнивание текста в поле компонента |
Рассмотрим пример, представленный на рис. 27.

Рис. 27. Пример с переключателями
Вопрос теста выведен в текстовое окно (TextBoxl). Некоторые свойства компонента следует изменить:
MultiLine = True Readonly = True TabStop = False
Свойство UseMnemonic всех компонентов RadioButton следует изменить на False. Выбрав свойство Lines, получаем доступ к окну редактора (рис. 28).
В случае если выбран правильный ответ (в данном вопросе ответ А), появится последовательность окон, представленная на рис. 29, 30. Кроме того, все переключатели переводятся в неактивное состояние.

Рис. 28. В окно редактора скопирован текст вопроса

Рис. 29. Выбран правильный ответ

Рис. 30. Переход к следующему вопросу
На рис. 31 показано окно сообщения, появляющееся в случае выбора неправильного ответа.

Рис. 31. Выбран неправильный ответ
Код процедуры представлен в листинге 25.
Листинг 25
namespace WindowsApplicationl
{
public partial class Forml : Form
{
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
if (radioButtonl.Checked )
{
MessageBox.Show("Вы ответили правильно !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
radioButtonl.Enabled = false ; radioButton2.Enabled = false ; radioButton3.Enabled = false ; radioButton4.Enabled = false ;
}
if (radioButton2.Checked )
{
MessageBox.Show("Вы ответили неправильно. Переходим к следующему вопросу!", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
radioButtonl.Enabled = false ; radioButton2.Enabled = false ; radioButton3.Enabled = false ; radioButton4.Enabled = false ;
}
if (radioButton3.Checked )
{
MessageBox.Show("Вы ответили неправильно. Переходим к следующему вопросу!", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
radioButtonl.Enabled = false ; radioButton2.Enabled = false ; radioButton3.Enabled = false ; radioButton4.Enabled = false ;
}
if (radioButton4.Checked )
{
MessageBox.Show("Вы ответили неправильно. Переходим к следующему вопросу!", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
radioButtonl.Enabled = false ; radioButton2.Enabled = false ; radioButton3.Enabled = false ; radioButton4.Enabled = false ;
}
if ((! radioButtonl.Checked) && (! radioButton2.Checked) && (! radioButton3.Checked) && (! radioButton4.Checked))
MessageBox.Show("Надо ответить на вопрос !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
if (radioButtonl.Checked)
MessageBox.Show("Переходим к следующему вопросу !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
Список (ListBox)
С помощью элемента управления Список пользователь может выбрать один или несколько элементов. Элементы списка можно добавлять или удалять динамически. Наиболее часто используемые свойства компонента ListBox представлены в табл. 17.
Таблица 17. Основные свойства компонента ListBox
Свойство |
Описание |
Font |
Шрифт, используемый для отображения элементов списка |
Items |
Список строк, выводимых на экран |
MultiColumn |
Отображение списка в несколько колонок |
Selectedlndex |
Номер элемента, выбранного в списке |
SelectionMode |
Определяет режим выбора элементов списка |
Sorted |
Определяет, будут ли элементы списка выведены в алфавитном порядке |
Рассмотрим пример, представленный на рис. 32.

Рис. 32. Пример работы списка. Исходное состояние окна с вопросом
Если пользователь, не ответив на вопрос теста, нажимает кнопку Ок, то появится сообщение, представленное на рис. 33.

Рис. 33. Предупреждающее сообщение
В процессе работы над вопросом пользователь выбирает один из элементов списка, представленных в окне 1ЫВох1, и, нажав одну из кнопок, переставляет выбранный ответ либо в Іі$іВох2, либо в І^ВохЗ, либо в И$1Вох4, при этом элементы списка удаляются из Н$1Вох1. Ситуация показана на рис. 34.

Рис. 34. Удаление элементов из ІізіВохІ
В случае правильного ответа на экране появится сообщение, представленное нарис. 35. _

Рис. 35. Сообщение
В листинге 26 представлена процедура, отвечающая за заполнение списка
listBoxl.
Листинг 26
private void Forml_Load(object sender, EventArgs e)
{
string [] itemlistl =new string[3] ;
itemlistl[0] = "Процесс ждет осуществления некоторого события;" ;
itemlistl[l] = "Процесс обладает всеми необходимыми ресурсами;" ;
itemlistl[2] = "Процесс заблокирован в связи с внешними обстоятельствами;" ;
for (int j = 0; j <= 2; j++)
listBoxl.Items.Add(itemlist1[j]);
}
В листинге 27 представлены процедуры, отвечающие за удаление элемента из списка listBoxl и перемещение его в другие списки.
Листинг 27
private void buttonl_Click(object sender, EventArgs e)
{
if (listBoxl.Selectedlndex == 0)
{
listBox2.Items.Add(listBoxl.Text);
listBox2.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(0);
}
if (listBoxl.Selectedlndex == 1)
{
listBox2.Items.Add(listBoxl.Text);
listBox2.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(1);
}
if (listBoxl.Selectedlndex == 2)
{
listBox2.Items.Add(listBoxl.Text);
listBox2.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(2);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (listBoxl.Selectedlndex == 0)
{
listBox3.Items.Add(listBoxl.Text);
listBox3.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(0);
}
if (listBoxl.Selectedlndex == 1)
{
listBox3.Items.Add(listBoxl.Text);
listBox3.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(1);
}
if (listBoxl.Selectedlndex == 2)
{
listBox3.Items.Add(listBoxl.Text);
listBox3.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(2);
}
}
private void button3_Click(object sender, EventArgs e)
if (listBoxl.Selectedlndex == 0)
{
listBox4.Items.Add(listBoxl.Text);
listBox4.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(0);
}
if (listBoxl.Selectedlndex == 1)
{
listBox4.Items.Add(listBoxl.Text);
listBox4.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(1);
}
if (listBoxl.Selectedlndex == 2)
{
listBox4.Items.Add(listBoxl.Text);
listBox4.Text = Convert.ToString(listBoxl.Selectedlndex); listBoxl.Items.RemoveAt(2);
}
}
В листинге 28 представлена процедура, отвечающая за проверку правильности ответа.
Листинг 28
private void button4_Click(object sender, EventArgs e)
{
if ((listBox2.Text=="") && (listBox3.Text=="") &&
(listBox4.Text==""))
MessageBox.Show("Надо ответить на вопрос !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
if ((listBox2.Items[0]=="Процесс обладает всеми необходимыми ресурсами;") && (listBox3.Items[0] =="Процесс ждет осуществления некоторого события;") && (listBox4.Items[0] == "Процесс заблокирован в связи с внешними обстоятельствами;"))
MessageBox.Show("Вы ответили правильно! Переходим к следующему вопросу", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
else
MessageBox.Show("Вы ответили неправильно! Переходим к следующему вопросу", "Тест", MessageBoxButtons.ОК, MessageBoxIcon.Information);
}
Пример программы с переключателями и флажками в структурах принятия решений
В данном примере пользователь с помощью флажков (checkBoxl, checkBox2, checkBox3, checkBox4) устанавливает качества, которые, по его мнению, правильно характеризуют его личность. Вывод осуществляется на элемент управления listBoxl. Есть возможность воспользоваться переключателем (radioButtonl, radioButton2). Интерфейс программы представлен на рис. 36.

Рис. 36. Внешний вид разрабатываемого приложения Код процедуры представлен в листинге 29.
Листинг 29
namespace WindowsApplicationl
{
public partial class Forml : Form
{
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
listBoxl.Items.Clear(); if (radioButtonl.Checked)
listBoxl.Items.Add("Ваш пол мужской");
else
if (radioButton2.Checked)
listBoxl.Items.Add("Ваш пол женский");
else
{
listBoxl.Items.Add("Вы не ввели свой пол");
}
listBoxl.Items.Add(" ") ;
listBoxl.Items.Add("Ваши качества:") ;
bool none=true;
if (checkBoxl.Checked)
{
listBoxl.Items.Add("Умный"); none = false;
}
if (checkBox2.Checked)
{
listBoxl.Items.Add("Инициативный"); none = false;
}
if (checkBox3.Checked)
{
listBoxl.Items.Add("Дружелюбный"); none = false;
}
if (checkBox4.Checked)
{
listBoxl.Items.Add("Трудолюбивый"); none = false;
}
if(none == true)
listBoxl.Items.Add ("Никакие качества не введены");
}
}
}
Поле со списком (ComboBox)
Элемент управления Поле со списком объединяет возможности поля ввода и прокручиваемого раскрывающегося списка. Пользователь может или выбрать элемент списка, или ввести его непосредственно в поле ввода. Поэтому поле со списком обладает многими свойствами и методами, входящими в рассмотренные раньше компоненты Тех1Вох и Ь^Вох. Наиболее часто используемые свойства компонента СотЬоВох представлены в табл. 18.
Таблица 18. Основные свойства компонента ComboBox
Свойство |
Описание |
Font |
Шрифт, используемый для отображения элементов списка |
Items |
Список строк, выводимых на экран |
Items.Count |
Общее количество элементов списка |
Items.Selectedlndex |
Номер элемента, выбранного в списке. Если выбранного элемента нет, то значение свойства равно минус 1 |
Sorted |
Определяет, будут ли элементы списка выведены в алфавитном порядке |

На рис. 37 представлен внешний вид программы, в которой используется рас сматриваемый компонент.
Вопрос 1
К числу оснонньх ресурсов современных еьчистительных систем могут быть отнесены такие ресурсы, как процессоры, память, диски, принтеры И Т.Д.
Ресурсы распределяются между:
Введите ответ
При использовании опрашиваемых прерываний процессор получает от запросившего прерывание устройства только информацию:
Введите ОТЕет
Ранние системы пакетной обработки быт предназначены для:
Введите ответ
Ok
Рис. 37. Пример работы компонента. Исходное состояние окна с вопросом
Если пользователь, не ответив на вопрос теста, нажимает кнопку Ok, то появится сообщение, представленное на рис. 38.
Для ввода элементов в список используется свойство Items компонента сош-ЬоВох.
На рис. 39 представлен открытый список элемента сошЬоВох1 разрабатывае мой программы.
Вопрос 1
Ошибка

Рис. 38. Предупреждающее сообщение
ЕЩЕ
К числу основных ресурсов современных еь чист тельных систем могут 5ьть отнесены такие ресурсы, как процессоры, память, диски, принтеры и т.д.
Ресурсы распределяются между:
Введите ответ
A. Системой прерываний Б. Процессами
B. Модулями ОС
Г. Открытыми зайлами
Беєдитє ОТЕЄТ
Ранние системы пакетной обработки быт предназначены для:
Введите отеет
Ok
Рис. 39. Элемент comboBoxl с открытым списком
В листинге 30 представлена процедура, отвечающая за проверку правильно сти ответа.
Листинг 30
namespace WindowsApplicationl
{
public partial class Forml : Form
{
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
if ((comboBoxl.Selectedlndex==-1)
- (comboBox2.Selectedlndex==-1)
- (comboBox3.Selectedlndex==-1))
MessageBox.Show("Необходимо указать все ответы!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
if ((comboBoxl.Selectedlndex==l) &&
(comboBox2.SelectedIndex==0) && (comboBox3.Selectedlndex==l))
MessageBox.Show("Вы ответили правильно! Переходим к следующему вопросу.", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
else
MessageBox.Show("Вы ответили неправильно!
Переходим к следующему вопросу.", "Тест", MessageBoxButtons.ОК, MessageBoxIcon.Information);
}
}
}
Объединение элементов (GroupBox)
Компонент Объединение элементов группирует логически связан
ные элементы управления. Свойство Text содержит текст, описывающий объединение элементов.
Полоса прокрутки (HScrollBar)
Элемент управления Полоса прокрутки служит для прокрутки содержимого окна или выбора значения из определенного интервала.
Наиболее часто используемые свойства компонента HScrollBar представлены в табл. 19.
Таблица 19. Основные свойства компонента HScrollBar
Свойство |
Описание |
Maximum |
Задает верхнюю границу интервала, соответствующего полосе прокрутки |
Minimum |
Задает нижнюю границу интервала, соответствующего полосе прокрутки |
Value |
Задает текущее значение полосы прокрутки (число между Min и Мах), определяющее положение ползунка |
В качестве примера разработаем приложение, в котором полоса прокрутки (hScrollBarl) будет служить для ввода возраста пользователя, на labell выводится возраст пользователя, на 1аЬе12 — пожелание, соответствующее возрасту. На рис. 40 представлен внешний вид программы, в которой используется рассматриваемый компонент.

Рис. 40. Внешний вид программы
Задание начальных значений элемента управления представлено в листинге 31.
Листинг 31
private void Forml_Load(object sender, EventArgs e)
{
this.Text= "Полоса прокрутки" ; hScrollBarl.Minimum = 0 ; hScrollBarl.Maximum = 120 ; hScrollBarl.LargeChange = 10 ; hScrollBarl.Value = 20 ;
В листинге 32 представлен основной код программы.
Листинг 32
private void hScrollBarl_ValueChanged(object sender, EventArgs e)
{
labell.Text =string.Format("Ваш возраст {0}", hScrollBarl.Value) ;
if (hScrollBarl.Value < 20)
label2.Text = "Береги честь смолоду";
else
if (hScrollBarl.Value < 40)
label2.Text = "Дорогу осилит идущий";
else
if (hScrollBarl.Value < 65)
label2.Text = "Главное — здоровье";
else
label2.Text = "Старикам везде у нас почет";
}
Список с флажками (CheckedListBox)
Компонент Список с флажками представляет собой прокручиваемый список, рядом с каждым элементом которого расположен флажок.
Наиболее часто используемые свойства компонента CheckedListBox представлены в табл. 20.
Таблица 20. Основные свойства компонента CheckedListBox
Свойство |
Описание |
Items |
Содержит элементы списка |
Items.Count |
Количество элементов списка |
Checkcdltems |
Коллекция, элементы которой содержат выбранные элементы списка |
CheckOnClick |
Способ пометки элемента списка. Если значение свойства равно False, то первый щелчок выделяет строку, а второй устанавливает в выбранное состояние переключатель. Если значение свойства равно True, то щелчок на элементе и выделяет, и устанавливает во включенное состояние переключатель |
На рис. 41 представлен внешний вид программы, в которой используется рассматриваемый компонент. Поставить флажок пользователю разрешено только в одном случае, соответственно может быть выбран только один ответ (правильный или неправильный).

Рис. 41. Пример работы компонента. Исходное состояние окна с вопросом
Если пользователь, не ответив на вопрос теста, нажимает кнопку Ок, то появится сообщение, представленное на рис. 42.

Рис. 42. Предупреждающее сообщение
После выбора пользователем правильного ответа появляется сообщение, представленное на рис. 43. Элементы списка при этом очищаются (рис. 44).

Рис. 43. Сообщение
Ш Вопрос 1
МЙх
Управление ресурсами вклочает решение нескольких общих, не зависящих от шла ресурса задач.
Укажите, какая из ниже приведенных задач является тшней (следует отметить один вариант).
Поставьте элахок в нужном пункте и нажмите Ok

Рис. 44. Произошла очистка элементов списка
В листинге 33 представлен основной код программы.
Листинг 33
namespace WindowsApplicationl {
public partial class Forml : Form {
public Forml()
{
InitializeComponent();
}
private void buttonl_Click(object sender, EventArgs e)
{
if (checkedListBoxl.Checkedltems.Count ==0)
MessageBox.Show("Надо ответить на вопрос !", "Тест", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
if (checkedListBoxl.Selectedlndex == 4)
{
checkedListBoxl.Items.Clear();
MessageBox.Show("Вы ответили правильно! Переходим к следующему вопросу.", "Тест", MessageBoxButtons.ОК,
MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Вы ответили неправильно!
Переходим к следующему вопросу.", "Тест", MessageBoxButtons.ОК, MessageBoxIcon.Information);
checkedListBoxl.Items.Clear();
}
}
}
}
Главное меню (MenuStrip). Разработка текстового редактора
С помощью компонента Главное меню (MenuStrip) программист создает в среде Microsoft Visual Studio главное меню программы. Для создания меню надо открыть панель Toolbox и перетащить значок элемента управления MenuStrip на форму разрабатываемого приложения. В результате в верхней части формы будет создана панель меню, а значок menuStripl появится в нижней части окна. Для добавления в меню имен команд надо щелкнуть по текстовому полю Туре Неге и ввести имя команды меню.
Выполнив одиночный щелчок на созданном пункте меню, получим доступ к свойствам, с помощью которых можно переименовать пункт меню, определить клавишу быстрого доступа и т.д. Наиболее часто используемые свойства представлены в табл. 21.
Таблица 21. Свойства ToolStripMenuItem (пункт меню)
Свойства |
Описание |
Checked |
Указывает на то, отмечен или нет пункт меню. По умолчанию имеет значение False (не отмечен) |
Image |
Служит для задания значка, размещаемого слева от пункта меню |
ShortcutKeys |
Определяет клавишу быстрого выбора пункта меню |
ShowShortcutKeys |
Определяет, отображается ли рядом с текстом пункта меню комбинация клавиш быстрого выбора. По умолчанию имеет значение True (отображается) |
Text |
Определяет текст пункта меню |
Для создания клавиши быстрого набора (горячей клавиши) необходимо перед символом имени (пункта) меню ввести символ амперсанда (&). Например, для создания пункта меню File надо ввести &File. Для добавления других клавиш быстрого набора (например, Ctrl+F9) необходимо установить свойство ShortcutKeys для соответствующего пункта меню.
Пункты меню можно объединять в логические группы с помощью разделителя (separator bar). Для установки разделителя надо щелкнуть правой кнопкой мыши и выбрать пункт Insert / Separator (вставить разделитель) либо ввести в текст меню символ «-».
Разработаем приложение, выполняющее функции текстового редактора, при создании которого будем использовать компонент MenuStrip.
На созданную форму следует нанести компонент menuStripl, компонент textBoxl, на вкладке Dialogs понадобятся компоненты openFileDialogl, save-FileDialogl.
Нижеперечисленные свойства компонента textBoxl следует изменить:
MultiLine = True ScrollBars = Vertical Dock = Fill
Создадим меню, представленное на рис. 45.
Файл |
||
Новый Открыть Сохранить как... |
||
Выход |
Рис. 45. Меню текстового редактора
Диалоговые окна открытия и сохранения файлов (OpenFileDialog, SaveFileDialog)
Компоненты OpenFileDialog и SaveFileDialog отвечают за создание стандартных диалоговых окон.
Выделив компонент openFileDialogl, выставим в свойстве DefaultExt = txt, Filter = Text Files | *.txt.
Добавим пространство имен System.IO.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
Для чтения информации из текстового файла применяется объект класса StreamReader. Чтение осуществляется методом ReadToEnd() объекта potok. Этот метод считывает очередную строку файла целиком.
В листинге 34 представлена процедура, отвечающая за открытие файла.
Листинг 34
private void oTKpbiTbToolStripMenuItem_Click (object sender, EventArgs e)
{
// Отобразить диалоговое окно
if (openFileDialogl.ShowDialog() == DialogResult.OK)
{
openFileDialogl.InitialDirectory =
Environment.CurrentDirectory ;
string path = openFileDialogl.FileName; try {
Encoding.Default);
// прочитать весь файл
textBoxl.Text = potok.ReadToEnd(); potok.Close();
}
catch (Exception exc)
{
MessageBox.Show("Ошибка чтения файла" + exc.ToString(), "Текстовый редактор", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// отобразить имя файла в заголовке окна
this.Text = "Открываем " + Path.GetFileName(path); openFileDialogl.FileName = string.Empty;
// курсор на последний символ
textBoxl.SelectionStart=textBoxl.TextLength ;
}
}
На рис. 46 представлено стандартное окно Открыть, полученное в результате работы процедуры.
В результате выполнения команды Сохранить как должно появиться диалоговое окно сохранения файла. Начнем с того, что выделим компонент saveFile-Dialogl и выставим в свойстве DefaultExt = txt, Filter =Text Files | *.txt.
Для записи информации в файл подходит объект класса Stream Writer, обеспечивающий запись в текстовые файлы. Запись осуществляется методом WriteLine объекта potokzap.

Рис. 46. Диалоговое окно Открыть
В листинге 35 представлена процедура, отвечающая за сохранение файла.
private void coxpaHHTbToolStripMenuItem_Click(object sender, EventArgs e)
{
// Отобразить диалоговое окно
if (saveFileDialogl.ShowDialog() == DialogResult.OK)
{
saveFileDialogl.InitialDirectory =
Environment.CurrentDirectory;
string path = saveFileDialogl.FileName; try {
StreamWriter potok_zap = new StreamWriter(path, false, Encoding.Default);
potok_zap.WriteLine(textBoxl.Text); // записать
текст в поток
potok_zap.Close(); // закрыть поток
}
catch (Exception exc)
{
MessageBox.Show("Ошибка доступа к файлу" + exc.ToString(), "Текстовый редактор", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
this.Text = "Сохраняем " + Path.GetFileName(path); textBoxl.Modified = false;
}
}
На рис. 47 представлено стандартное окно Сохранить как, полученное в ре зультате работы программы.

Рис. 47. Диалоговое окно Сохранить
Создадим обработчик события для пункта меню Новый. В листинге 36 пред ставлена процедура, отвечающая за это действие.
private void HOBbi?iToolStripMenuItem_Click (obj ect sender, EventArgs e)
{
textBoxl.Clear();
this.Text = "Новый документ";
}
Диалоговое окно установки шрифта (FontDialog)
Расширим возможности разрабатываемой программы. Добавим пункты меню, позволяющие изменять размер шрифта. На вкладке Dialogs следует выбрать компонент FontDialog и нанести его на форму.
Добавим команду меню, представленную на рис. 48.
Формат |
||
Шрифт |
Рис. 48. Добавление команды меню
В листинге 37 представлена процедура, отвечающая за появление стандартного диалогового окна Шрифт.
Листинг 37
//Процедура Шрифт
private void uipH<|)TToolStripMenuItem_Click: (object sender, EventArgs e)
{
fontDialogl.Font = textBoxl.Font; if ( f ontDialogl. ShowDialog () == DialogResu.lt. OK) if (!textBoxl.Font.Equals(fontDialogl.Font))
{
Font f = textBoxl.Font;
textBoxl.Font = fontDialogl.Font;
f.Dispose(); //Освобождение ресурсов
}
}
Результатом выполнения процедуры является окно, представленное на рис. 49.

Рис. 49. Диалоговое окно Шрифт
Добавим в меню пункты, отвечающие за выравнивание текста (рис. 50), и напишем соответствующие процедуры, представленные в листинге 38.
Формат |
||
Шрифт | ||
Выравнивание текста ? |
По левому краю По центру По правому краю |
|
Рис. 50. Пункты меню, отвечающие за выравнивание текста
Листинг 38
private void noJleBOMyKpaioToolStripMenuItem_Click (object sender,
EventArgs e)
{
textBoxl.TextAlign = HorizontalAlignment.Left ;
}
private void no4eHTpyToolStripMenuItem_Click(object sender,
EventArgs e)
{
textBoxl.TextAlign = HorizontalAlignment.Center ;
}
private void no?paBOMyKparoToolStripMenuItem_Click(object sender, EventArgs e)
{
textBoxl.TextAlign = HorizontalAlignment.Right;
}
Дополним разрабатываемый текстовый редактор пунктами меню, отвечающие за начертание символов: жирный, курсив, подчеркнутый (рис. 51).
Формат |
||
Шрифт Выравнивание текста ? | ||
Начертание шрифта ? |
Жирным Курою Подчеркнутый |
|
Рис. 51. Пункты меню, отвечающие за начертание символов
Для того чтобы нажатие на любой пункт данного вложенного меню обрабатывалось с помощью одного обработчика, следует создать обработчик для пункта меню Жирный (листинг 39).
Затем связываем уже имеющийся обработчик private void жирный ToolStripMenuItem_CHck(object sender, EventArgs e) с событием Click для каждого пункта меню Курсив и Подчеркнутый. На вкладке Events для каждого из пунктов меню следует выбрать событие Click, а затем имя обработчика жирныйТоо^прМепиКетСИск из выпадающего списка. Таким образом создается один общий обработчик. Это возможно благодаря использованию в обработчике private void жирныЙТoolStripMenu 1 tem_Click(object sender, EventArgs e) параметра Sender, в котором передается компонент, вызвавший данный обработчик.
В листинге 39 приведен код процедуры, отвечающий за изменение начертания символов. В коде используется условная операция (? :). Ее синтаксис следующий:
Операнд! ? Операнд2 : ОперандЗ
В коде определяется результат вычисления первого операнда, и если он равен true, то результатом условной операции будет значение второго операнда, если false — значение третьего операнда.
При применении операции поразрядной дизъюнкции (ИЛИ), обозначаемой в коде символом |, бит результата равен 1 тогда, когда соответствующий бит одного из операндов равен 1. Ее выполнение приводит к добавлению нового стиля к существующему набору стилей Font.Style.
Применение операции поразрядного отрицания (~) инвертирует каждый разряд в двоичном представлении операнда, т.е. меняет 1 на 0 и 0 на 1, что в совокупности с использованием операции & (И — поразрядная конъюнкция) приводит к удалению стиля. Бит результата операции & равен 1 тогда, когда соответствующий бит обоих операндов равен 1. Выполнение кода процедуры приведет к появлению флажка рядом с выбранным пунктом меню. Флажок будет сниматься при повторном выборе пункта меню.
Листинг 39
private void 5KHpHbMToolStripMenuItem_Click (object sender, EventArgs e)
{
ToolStripMenuItem gir = sender as ToolStripMenuItem; gir.Checked = !gir.Checked;
FontStyle fs = textBoxl.Font.Style;
fs = gir.Checked ? (fs | gir.Font.Style) : (fs &
-gir.Font.Style);
Font f = textBoxl.Font; textBoxl.Font = new Font(f, fs); f.Dispose();
}
Дополним меню текстового редактора пунктом Цвет и двумя вложенными пунктами Цвет шрифта и Цвет фона (рис. 52).
| Формат |
||
Шрифт Выравнивание текста ? Начертание шрифта ? |
||
Цвет ? |
Цвет шрифта Цвет фона |
|
Рис. 52. Пункты меню, отвечающие за цвет шрифта и фона
Для вызова диалогового окна Цвет на вкладке Dialogs следует выбрать компонент ColorDialog и нанести его на форму.
Напишем соответствующие процедуры, представленные в листинге 40.
Листинг 40
private void ii,BeTllIpHTaToolStripMenuItem_Click (obj ect sender, EventArgs e)
{
colorDialogl.Color = textBoxl.ForeColor; if (colorDialogl.ShowDialog() == DialogResult.OK) textBoxl.ForeColor = colorDialogl.Color;
}
private void uBeToHaToolStripMenuItem_Click (object sender,
EventArgs e)
colorDialogl.Color = textBoxl.BackColor; if (colorDialogl.ShowDialog() == DialogResult.OK) textBoxl.BackColor = colorDialogl.Color;
}
Результатом выполнения процедур является появление окна, представленного на рис. 53. _

Рис. 53. Диалоговое окно Цвет
Редактирование |
||
Отменить |
||
Вырезать Копировать Вставить Удалить |
||
Выделить все |
При работе с текстом нельзя обойтись без таких возможностей, как копирование, вставка, удаление, отмена предыдущих действий. Поэтому расширим возможности разрабатываемого редактора за счет добавления команды Редактирование с вложенными пунктами меню, представленными на рис. 54.
Рис. 54. Пункты меню команды Редактирование
В листинге 41 представлены процедуры, отвечающие за соответствующие действия.
Листинг 41
private void OTMeHHTbToolStripMenuItem_Click(object sender, EventArgs e)
{
textBoxl.Undo(); //отменяем действия
}
private void Bbipe3aTbToolStripMenuItem_Click (object sender,
EventArgs e)
{
textBoxl.Cut(); //вырезаем
private void KonnpoBaTbToolStripMenuItem_Click(object sender, EventArgs e)
{
textBoxl.Copy(); //копируем
}
private void BCTaBHTbToolStripMenuItem_Click(object sender,
EventArgs e)
{
textBoxl.Paste(); //вставляем
}
private void ynannTbToolStripMenuItem_Click(object sender,
EventArgs e)
{
textBoxl.SelectedText = //удаляем
}
private void BbmenHTbBceToolStripMenuItem_Click (object sender, EventArgs e)
{
textBoxl.SelectAll(); //выделяем весь текст
}
Панель инструментов (ToolStrip)
Для создания панели инструментов в Visual C# используется компонент Tool-Strip. После размещения панели инструментов следует выделить элемент управления textBoxl и выполнить команду Format / Order / Bring to Front для того, чтобы панель не перекрывала верхнюю часть текстового окна.
Для того чтобы добавить на панель ToolStrip кнопку, следует воспользоваться свойством Items данного компонента. В появившемся окне Items Collection Editor (рис. 55) следует нажимать кнопку Add для добавления кнопок либо из ниспадающего списка выбирать другие элементы, например Separator (Разделитель).

Рис. 55. Окно Items Collection Editor
Создав первую кнопку (имя по умолчанию toolStripButtonl), следует воспользоваться свойством Image кнопки toolStripButtonl. В появившемся окне
Select Resource выбираем переключатель Project resource Ше, затем нажимаем кнопку Import и переходим в следующий подкаталог Microsoft Visual Stu-dio/Common/Graphics/Bitmaps, выбирая соответствующее изображение для кнопки (путь к указанному подкаталогу может быть другой). Подобным образом размещаем другие кнопки и изображения для них.
Созданная панель представлена на рис. 56.

Рис. 56. Панель инструментов
После создания панели инструментов надо связать каждую кнопку с уже существующими обработчиками событий. Для этого выделяем кнопку, например Новый. На вкладке Events находим событие Click и из ниспадающего списка выбираем событие HOBbmToolStripMenuItemClick. Подобная ситуация представлена на рис. 57.
HOBbiMToolStripMenuItem_Click
открытьТ oolStripMenuItem_Click coxpaHHTbToolStripMenuItem_Ckk шрифтТ oolStripMenuItem_Click поЛевомуКраюТ oolStripMenuItem_Click noUeHTpyToolStripMenuItem_Click поПравомуКраюТ oolStripMenuItem_Click MOipHbiftToolStripMenuItem_Click иветШрифтаТоо151прМепиНет_Скк иветФонаТ oolStripMenuItem_Click OTMeHMTbToolStripMenuItem_Click Bbipe3aTbToolStripMenuItem_Click ^
Is:
Рис. 57. Ниспадающий список вкладки Events
Такая последовательность действий выполняется для каждой кнопки. Не надо забывать, что для кнопок Жирный, Курсив, Подчеркивание назначается один обработчик — HfHpHbiftToolStripMenuItem_Click.
Для того чтобы при наведении указателя мыши на кнопку появлялась подсказка, необходимо воспользоваться свойством ToolTipText.
Строка состояния (StatusStrip)
Для создания строки состояния необходимо найти компонент StatusStrip в окне ТооШох и разместить его на форме. Затем, выбрав свойство Items данного компонента, в окне Items Collection Editor следует добавить три элемента tool-StripStatusLabel. Первый будет показывать состояние клавиши Caps Lock (включена/выключена), второй — выводить текущее время, третий — показывать количество введенных символов.
Далее следует нанести на форму объект timerl и выставить следующие свойства:
Enabled = True
Interval = 1000 (время, измеряемое в миллисекундах)
В листинге 42 представлены соответствующие обработчики, с помощью которых выводится информация, размещаемая в строке состояния.
Листинг 42
private void timerl_Tick(object sender, EventArgs e)
toolStripStatusLabell.Text =
Control.IsKeyLocked(Keys.CapsLock) ? "Нажата Caps Lock" :
toolStripStatusLabel2.Text =
DateTime.Now.ToLongTimeString();
}
private void textBoxl_TextChanged(object sender, EventArgs e)
{
toolStripStatusLabel3.Text = "Количество набранных символов=" + textBoxl.TextLength.ToString();
}
Внешний вид разработанного текстового редактора представлен на рис. 58.

Рис. 58. Внешний вид разработанного текстового редактора
Контрольные вопросы к главе 2
- 1. Поясните понятия «инкапсуляция», «наследование» и «полиморфизм».
- 2. Поясните следующие понятия: «метод», «свойство», «событие».
- 3. Какие методы ввода и вывода данных используются для приложений, разрабатываемых при помощи Visual С#? Напишите синтаксис используемых методов.
- 4. В каких случаях при разработке концепции глобальной обработки ошибок применяется конструкция Try...Catch? Поясните работу обработчиков исключений на примерах.
- 5. Назовите основные элементы управления, используемые при программировании простых приложений, и поясните их назначение.