32
2. Практическая часть. Создание форм с элементами управления.
2.1. Создание формы с различными видами кнопок.
Программа (рис. 2.1) должна будет выполнять следующие функции: радиокнопки задают текст сообщения, которое будет выводиться по нажатию на обычную кнопку. Флажок должен определять — выводить сообщение или нет. Создайте новый Windows Application проект под названием TestButtons. Сохраните его в созданную для ваших проектов папку. Измените некоторые свойства созданной формы:
Name — «TestButtonsForm»
Text — «Тест для кнопок»
Теперь добавьте на вашу форму один элемент управления GroupBox, три элемента RadioButton, один элемент CheckBox и один элемент Button. На рис. 2.1 показано примерное расположение элементов. Вы можете разместить элементы произвольным образом. Однако заметьте, что все три радиокнопки должны быть помещены в один GroupBox. Иначе они не будут связаны между собой.
Рис. 2.1. Проектирование формы для приложения TestButtons.
Теперь измените некоторые свойства добавленных элементов:
Button1:
Text — Показать сообщение
groupBox1:
Text — Выберите текст сообщения
radioButton1:
Text — Первое сообщение
radioButton2:
Text—Второе сообщение
radioButton3:
Text —Третье сообщение
checkBox1:
Text — Показывать сообщение
Checked — True
Теперь давайте обратимся к коду нашей программы, который создала среда Visual Studio .NET. Среда создает два основных файла с кодом – код дизайнера форм (TestButtons.Designer.cs) и основной код программы (Program.cs).
Файл TestButtons.Designer.cs содержит:
namespace TestButtons
{
partial class TestButtonsForm
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestButtonsForm));
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.radioButton3=new System.Windows.Forms.RadioButton();
this.radioButton2=new System.Windows.Forms.RadioButton();
this.radioButton1=new System.Windows.Forms.RadioButton();
this.checkBox1= new System.Windows.Forms.CheckBox();
this.button1 = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
// groupBox1
this.groupBox1.Controls.Add(this.radioButton3);
this.groupBox1.Controls.Add(this.radioButton2);
this.groupBox1.Controls.Add(this.radioButton1);
resources.ApplyResources(this.groupBox1, "groupBox1");
this.groupBox1.Name = "groupBox1";
this.groupBox1.TabStop = false;
//
// radioButton3
//
resources.ApplyResources(this.radioButton3, "radioButton3");
this.radioButton3.Name = "radioButton3";
this.radioButton3.TabStop = true;
this.radioButton3.UseVisualStyleBackColor = true;
//
// radioButton2
//
resources.ApplyResources(this.radioButton2, "radioButton2");
this.radioButton2.Name = "radioButton2";
this.radioButton2.TabStop = true;
this.radioButton2.UseVisualStyleBackColor = true;
//
// radioButton1
//
resources.ApplyResources(this.radioButton1, "radioButton1");
this.radioButton1.Name = "radioButton1";
this.radioButton1.TabStop = true;
this.radioButton1.UseVisualStyleBackColor = true;
//
// checkBox1
//
resources.ApplyResources(this.checkBox1, "checkBox1");
this.checkBox1.Name = "checkBox1";
this.checkBox1.UseVisualStyleBackColor = true;
//
// button1
//
resources.ApplyResources(this.button1, "button1");
this.button1.Name = "button1";
this.button1.UseVisualStyleBackColor = true;
//
// TestButtonsForm
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode= System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.button1);
this.Controls.Add(this.checkBox1);
this.Controls.Add(this.groupBox1);
this.Name = "TestButtonsForm";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.RadioButton radioButton3;
private System.Windows.Forms.RadioButton radioButton2;
private System.Windows.Forms.RadioButton radioButton1;
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.Button button1;
}
}
Ваш код может отличаться от приведенного в методических указаниях координатами расположения элементов управления и их размером. То есть свойствам Location и Size объектов в функции InitializeComponent могут присваиваться другие значения. Это никак не влияет на работоспособность программы.
Если вы строго следовали всем инструкциям, то программа должна построиться без ошибок. Откомпилируйте ее и запустите. Пока программа не способна выполнять какие-либо действия. Давайте наделим ее функциональностью.
Добавьте функцию-обработчик для кнопки button1. Используйте имя по умолчанию для этой функции — button1_Click, создаваемое средой VisualStudio .NET. При этом в файл TestButtons.cs добавится функция:
private void button1_Click(object sender, System.EventArgs e)
{
}
Также появится обработчик этого события в функции InitializeComponent:
this.button1.Click += new System.EventHandler(this.button1_Click);
Добавьте в тело функции button1_Click следующий код:
private void button1_Click(object sender, EventArgs e)
{
//объявляем строковую переменную
//для хранения выбранного сообщения
string strMessage = "";
//определяем какая именно радиокнопка отмечена
//и выбираем в соответствии с этим
//текст выводимого сообщения
//проверяем первую радиокнопку
if (radioButton1.Checked == true)
{
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage = radioButton1.Text;
}
//проверяем вторую радиокнопку
else if (radioButton2.Checked == true)
{
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage = radioButton2.Text;
}
//проверяем третью радиокнопку
else if (radioButton3.Checked == true)
{
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage = radioButton3.Text;
}
//проверяем, установлен ли флажок
//разрешающий вывод сообщения
//если да, то выводим выбранное сообщение на экран
if (checkBox1.Checked == true)
MessageBox.Show("Вы выбрали " + strMessage);
}
Подробное описание работы функции приведено в комментариях. Откомпилируйте и запустите программу. Выберите первую радиокнопку «первое сообщение». Нажмите кнопку Показать сообщение. На экране появится надпись: Вы выбрали первое сообщение. Выбрав иную радиокнопку, вы получите другой текст сообщения. Теперь уберите флажок Показывать сообщение. Нажмите кнопку Показать сообщение. На экране ничего не должно появиться. Если программа работает в строгом соответствии с данным описанием, значит, вы все сделали верно.
2.2. Создание формы с использованием списков.
Необходимо написать программу, предназначенную для учета данных об участниках соревнований. Программа будет содержать два списка — ComboBox, для ввода информации об участниках, и CheckedListBox, для хранения и обработки данных. С помощью списка ComboBox пользователь будет выбирать фамилии лиц, которых необходимо добавить в список участников. Две кнопки на форме будут добавлять или удалять участников из списка.
Создайте новый Windows Applications проект под названием TestLists. Сохраните его в созданную для наших проектов папку. Переименуйте файл Form1.cs в TestListsForm.cs. Теперь добавьте на вашу форму следующие элементы управления:
• GroupBox, и поместите в него CheckedListBox
• ComboBox
• два элемента Button.
Приблизительное размещение элементов представлено на рис. 2.2.
Рис. 2.2. Проектирование формы для приложения TestLists.
Вы можете разместить элементы произвольно. В данном примере можно было обойтись и без элемента GroupBox, так как он предназначен только для оформления интерфейса программы. Однако возьмите себе за хорошую привычку всегда помещать списки внутрь GroupBox элементов. Это сделает ваши программы более привлекательными.
Измените некоторые свойства созданной формы:
Text —«работа со списками»
Теперь изменим свойства элементов управления:
groupBox1:
Text — «список участников»
checkedListBox1:
Name — memberList
comboBox1:
Name — peopleList
Text —«»
button1:
Name — buttonAdd
Text — «Добавить»
button2:
Name — buttonDelete
Text — «Удалить»
Элементы управления ComboBox и CheckedListBox могут быть проинициализированы с помощью дизайнера среды VisualStudio.Net. Для хранения элементов списков данные компоненты имеют свойство Items. Свойство Items само по себе является массивом строк. Давайте проинициализируем элемент управления ComboBox, который имеет имя peopleList, списком фамилий предполагаемых участников соревнований. Для этого в окне свойств peopleList выберите свойство Items. Откройте окно StringCollectionEditor, нажав на кнопку с тремя точками в поле Items. Добавьте в предложенный список три фамилии: Иванов, Петров, Сидоров (рис. 2.3).
Рис. 2.3. Редактор списка строк.
И напоследок, добавьте обработчики для кнопок Добавить и Удалить, два раза щелкнув левой кнопкой мыши по каждой из кнопок. Подготовительный этап к написанию программы завершен. Сохраните сделанные вами изменения. Проанализируйте сгенерированный средой код программы (файлы TestListsForm.cs и TestListsForm.Designer.cs).
Если вы строго следовали инструкциям, то программа должна откомпилироваться и запуститься. Проверьте это.
Сейчас необходимо добавить обработчики для кнопки «Добавить» и «Удалить». Как известно из исходных данных, кнопка «Добавить» должна заносить строку, выбранную в комбобоксе, в список участников. Для этого измените функцию buttonAdd_Click так, как показано ниже:
private void buttonAdd_Click(object sender, System.EventArgs e)
{
//работаем со списком для ввода фамилий
//проверяем выбран ли элемент в списке
if(peopleList.Text.Length != 0)
{
//если элемент выбран,
// то переносим его в список участников
memberList.Items.Add(peopleList.Text);
}
else
{
//если элемент не выбран
//то выдаем информационное сообщение
MessageBox.Show("Выберите элемент в списке для ввода или введите новый.");
}
}
Описание работы функции приведено вместе с ее кодом. Функция memberList.Items.Add добавляет новый элемент в список memberList. При этом параметром функции является значение свойства peopleList.Text, которое выбирает пользователь. Теперь осталось реализовать удаление элементов из списка. Для этого введите код для функции buttonDelete_Click.
private void buttonDelete_Click(object sender, System.EventArgs e)
{
//пока список помеченных элементов не пуст
while(memberList.CheckedIndices.Count 0)
//удаляем из общего списка участников по одному элементу
//при этом список помеченных элементов
//автоматически обновляется
// каждый раз нулевой элемент из CheckedIndices
//будет содержать индекс первого помеченного
// в списке объекта
memberList.Items.RemoveAt(memberList.CheckedIndices[0]) ;
//при удалении из списка последнего помеченного элемента
//CheckedIndices.Count станет равным нулю
//и цикл автоматически завершится
}
Функция memberList.Items.RemoveAt удаляет из списка элемент по его индексу. При этом элементы списка, идущие за удаленным, уменьшают свой индекс на единицу. Это обязательно нужно учитывать при дальнейшем обходе списка. Класс CheckedListBox содержит свойство CheckedIndices, которое представляет собой массив индексов всех помеченных элементов списка. Этот массив тоже изменяется, если из списка был удален помеченный элемент. А поскольку мы удаляем из списка только помеченные элементы, то CheckedIndices будет изменяться всегда: место удаленного элемента займет следующий за ним. Цикл продолжит работать до тех пор, пока в списке CheckedIndices будет оставаться хоть один элемент.
Давайте рассмотрим работу нашей программы на примере. Откомпилируйте и запустите приложение. Заполните список участников так, как показано на рис. 2.4. Для того чтобы добавить элемент в список, выберите его в комбобоксе и нажмите кнопку Add.
Рис. 2.4. Окно приложения TestLists.
По умолчанию, элемент управления CombоВох имеет стиль DropDown (свойство СоmboBox.DropDownStyle.DropDown). Этот стиль дает возможность пользователю не только выбирать элементы из списка, но и вводить данные с клавиатуры. Поэтому для добавления в список фамилии «Лазаренко», наберите ее на клавиатуре и нажмите кнопку Add.
Теперь давайте разберемся с логикой работы программы при удалении элементов из списка. Для этого выделите в списке фамилии «Петров» и «Сидоров», которые в нашем списке имеют индексы 1 и 2 соответственно (начиная с нулевого). Поэтому массив CheckedIndices будет содержать два элемента — 1 и 2. При нажатии кнопки Delete программа по циклу начинает удалять элементы из списка. Нулевым элементом в массиве CheckedIndices стоит число 1 (индекс фамилии «Петров»), поэтому фамилия «Петров» первой удаляется из списка. При этом фамилии «Сидоров» и «Лазаренко» изменяют свои индексы с 2 и 3 на 1 и 2 соответственно. Массив CheckedIndices тоже модифицируется. Во-первых, из него удалится нулевой элемент, индекс фамилии «Петров». Во-вторых, место нулевого элемента в массиве CheckedIndices теперь займет индекс фамилии «Сидоров». А поскольку «Сидоров» теперь имеет индекс 1 в общем списке, то CheckedIndices [0] будет содержать число 1. На второй итерации цикла удаления из списка исчезнет фамилия «Сидоров», а «Лазаренко» переместится на позицию 1. В итоге, коллекция CheckedIndices окажется пустой, и цикл завершится.
Элемент управления Label предназначен для создания подписей к другим элементам управления или для вывода информационных сообщений прямо на поверхности формы. Например, вы можете сочетать метки с полями ввода (см. рис. 2.5). Например, на форму TestListsForm можно добавить элемент управления Label с надписью «Выберите фамилию участника или введите новую». Надписи повышают уровень восприятия программы пользователем.
Рис. 2.5. Добавление элемента управления Label к форме приложения TestLists.
2.3. Создание формы с использованием бегунка, индикатора прогресса и регулятора численных значений.
Для усвоения информации о работе с вышеуказанными компонентами, давайте рассмотрим пример. Напишем приложение, в котором бегунок и элемент управления NumericUpDown управляют индикатором прогресса. Дополнительное условие: бегунок и NumericUpDown должны работать синхронно. То есть, при изменении значения одного элемента, значение другого должно изменятся автоматически на ту же величину.
Создайте новый Windows Application проект под названием TestIndicator. Сохраните его в созданную для наших проектов папку. Переименуйте файл Forml.cs в TestIndicatorForm.cs. Теперь добавьте на вашу форму следующие элементы управления:
• TrackBar
• ProgressBar
• NumericUpDown.
Примерное размещение элементов изображено на рис. 2.6. Вы можете расположить элементы по-своему.
Рис. 2.6. Проектирование формы приложения TestIndicator.
Измените свойства элементов управления. Свойства элемента TrackBar1:
Maximum —100
TickStyle — Both
При этом TrackBar изменит свой вид. Бегунок примет прямоугольную форму, а полоски появятся и сверху, и снизу от него. Это результат изменения свойства TickStyle. Данное свойство определяет месторасположение черточек элемента управления. В этом случае было выбрано значение Both (с обеих сторон). Кроме того, возможны расположения только сверху, только снизу или вообще без черточек. Свойства Minimum и Maximum задают минимальное и максимальное значения, до которых может изменяться TrackBar. В данном случае мы задали максимальное значение 100, а минимальное 0 (оставили по умолчанию). То есть, когда бегунок будет находиться в крайнем левом положении, значение его свойства Value будет равно 0, а при нахождении бегунка в крайнем правом положении свойство Value будет иметь значение 100.
Свойства объекта numericUpDown1 оставим по умолчанию. Элемент управления NumericUpDown также имеет свойства Minimum и Maximum. И по умолчанию, свойство Minimum равно 0, свойство Maximum равно 100. Это соответствует параметрам, установленным для объекта trackBar1. Очень важное свойство компонента NumericUpDown — DecimalPlaces. Оно определяет количество знаков после запятой. В нашем примере это свойство необходимо оставить по умолчанию равным 0, однако при необходимости получить большую точность, чем целое значение, следует устанавливать значение свойства в соответствии с заданной точностью.
Измените значение свойства Text формы на «Управление движением». Проанализируйте код программы.
Элементы numericUpDown1 и trackBar1 являются управляющими, а элемент progressBar l— управляемым. Давайте зададим обработчики событий для управления индикатором прогресса. Итак, компонент TrackBar имеет событие Scroll, которое предназначено для обработки перемещения указателя бегунка. Создайте функцию обработчик для события Scroll, щелкнув два раза указателем мыши по имени события в окне свойств. В код программы добавится функция с именем trackBar1_Scroll. Измените ее код так, как показано ниже:
private void trackBar1_Scroll(object sender, System.EventArgs e)
{ int Value = trackBar1.Value;
numericUpDown1.Value = Value;
progressBar1.Value = Value;
}
Теперь при движении курсора бегунка будут изменяться положение индикатора прогресса и значение элемента numericUpDown1. Однако это еще не полная синхронность работы элементов, потому что управление должно вестись из двух элементов: бегунка и регулятора числовых значений (NumericUpDown), а у нас сейчас управление возможно лишь от бегунка. Давайте добавим обработчик события ValueChanged для элемента numericUpDown1. Для этого щелкните два раза указателем мыши по имени события ValueChanged в окне свойств. В код программы добавится функция с именем numericUpDown1_ValueChanged. Измените ее содержимое аналогично функции trackBar1_Scroll.
private void numericUpDown1_ValueChanged(object sender, System.EventArgs e)
{ int Value = (int)numericUpDown1.Value;
trackBar1.Value = Value;
progressBar1.Value = Value;
}
Все, программа готова к эксплуатации. Откомпилируйте и запустите ее. Попробуйте изменить положение бегунка. При этом индикатор прогресса и числовой итератор изменят свои значения на соответствующие величины. Попробуйте управлять индикатором прогресса при помощи числового итератора. Эффект будет аналогичный работе с бегунком (рис. 2.7).
Рис. 2.7. Окно приложения «Управление движением».
3. Задания.
1. Создайте приложение, на форме которого определите такие элементы:
а) кнопка «Старт», при нажатии на которую запускается таймер.
б) кнопка «Стоп», при нажатии на которую останавливается таймер. Кнопка «Стоп» недоступна, если таймер не запущен.
в) индикатор прогресса, который показывает состояние таймера.
г) элемент NumericUpDown, в котором указывается время, на которое запускается таймер.
д) комбинированный список с элементами: секунды, минуты, часы. По умолчанию в комбинированном списке должны быть установлены секунды. Значение в комбинированном списке определяет единицы измерения времени таймера.
По истечению времени таймера приложение закрывается. Оставшееся время таймера отображается в виде надписи на форме.
2. Создайте Windows-приложение, на форме которого определите следующие элементы:
а) радиокнопки, которые управляют выбором изображения фона формы (4 варианты). При выборе радиокнопки сразу изменяется фон формы.
б) в комбинированном списке выбирается заголовок формы (4 варианта).
в) элементы NumericUpDown управляют размерами формы; при изменении размеров формы с помощью мыши должны изменяться значения в элементах NumericUpDown.
г) список с единичным выбором позволяет выбрать шрифт на всех элементах управления.
Во всех элементах должны быть выбраны значения по умолчанию, именно те которые используются на форме при запуске приложения.
Рис. 2.8. Форма приложения задания №2.