Обработка исключений

Прерывания, рассматриваемые в данном параграфе, относятся к классу внутренних прерываний и называются исключениями (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.

Внешний вид разрабатываемого приложения Код процедуры представлен в листинге 29

Рис. 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 (Разделитель).

Окно Items Collection Editor

Рис. 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. Назовите основные элементы управления, используемые при программировании простых приложений, и поясните их назначение.
 
< Пред   СОДЕРЖАНИЕ     След >