Для надання користувачу можливості здійснювати вибір деяких параметрів або подальших дій в інтерфейсній частині програми передбачені такі елементи управління як Прапорець (CheckBox) та Перемикач (RadioButton) (рис. 7.1). Кожен з таких елементів може перебувати лише в одному з двох станів: вибраний (true) або не вибраний (false). Отримане таким чином логічне значення зручно опрацьовувати за допомогою алгоритмічної структури розгалуження.
Стан елементу управління Прапорець не залежить від стану інших Прапорців - на формі можуть бути обраними (перебувати в стані true) одразу декілька елементів.
На відміну від Прапорця, стан елементу Перемикач залежить від стану інших Перемикачів – з групи елементів даного типу може бути вибраний лише один. Для об’єднання декількох перемикачів у групу зручно використовувати спеціальний елемент-контейнер (GroupBox) (рис. 7.1).
Окрім вже відомих властивостей типу Text, Font, ForeColor та інших, елементи Прапорець та Перемикач мають важливу властивість Checked, яка відображає стан даного елемента (true – елемент вибраний або false – елемент не вибраний).
Створіть рішення «Lesson_7» проект «Task_1». Відомо два цілих числа. Скласти програму для знаходження суми, різниці, добутку або частки даних чисел в залежності від вибору користувача (рис. 7.2, 7.3).
При побудові інтерфейсу програми для забезпечення можливості вибору однієї з чотирьох дій над числами використаємо елементи RadioButton, помістивши їх в попередньо встановлений на формі контейнер GroupBox. Для першого елемента RadioButton значення властивості Checekd потрібно змінити на true.
Для розв’язання даної задачі спочатку дізнаємося, які числа задав користувач, а потім, в залежності від вибраної дії, обчислимо результат – значення змінної x. Для цього скористаємося вкладеними розгалуженнями else – if. В якості умови розгалуження використаємо логічний вираз radioButton1.Checked, який буде істинний, якщо перший Перемикач вибраний і хибний, коли даний Перемикач не вибрано. Останньою дією виведемо результат на екран. Реалізація наведеного алгоритму мовою C# має такий вигляд:
private void button1_Click(object sender, EventArgs e) { int a = int.Parse(textBox1.Text); int b = int.Parse(textBox2.Text); double x; if (radioButton1.Checked) x = a + b; else if (radioButton2.Checked) x = a - b; else if (radioButton3.Checked) x = a * b; else x = Math.Round((double)a / b, 2); label2.Text = "Відповідь: " + x; }
Зауваження 1. При обчисленні частки ділене або дільник потрібно перетворити в дробове число, використавши явне перетворення типів. Якщо цього не зробити, результатом буде лише ціла частина від ділення.
Зауваження 2. Результат ділення заокруглений до двох знаків після коми – функція Round.
Зауваження 3. При виведенні відповіді, яка складається з текстової константи і числової змінної, останню компілятор автоматично перетворює в текстову величину, тому в таких випадках функцію ToString() можна не записувати.
Розглянемо ще одне завдання на використання елементів Перемикач. (рішення lesson_7, проект task_2). Задача «Правильні многогранники» - скласти програму, яка відображає кількість граней та зображення одного з п’яти правильних многогранників: тетраедр, куб, октаедр, додекаедр або ікосаедр (рис. 7.4, 7.5).
При конструюванні інтерфейсу програми перший Перемикач потрібно зробити вибраним (власивість Checked встановити рівну true). Таким чином, за замовчуванням буде обрано фігуру тетраедр, а, отже, і в об’єкт PictureBox потрібно завантажити відповідне зображення, а в напис записати текст «Кількість граней = 4».
В програмному коді в кожній вітці вкладених розгалужень будемо визначати кількість граней фігури та завантажувати у об’єкт PictureBox відповідне зображення. Програмно завантажити зображення в PictureBox можна таким чином:
pictureBox1.Image = Image.FromFile("cub.png");
В лапках потрібно записувати ім’я файлу з вказаним шляхом до нього. Для спрощення роботи можна вказувати лише ім’я файлу, але, в такому разі, зображення повинні міститися в тій самій папці, де знаходиться запускний файл даного проекту (exe-файл). Шлях до exe-файлу проекту наступний: lesson_7/task_2/bin/Debug. Отже, всі зображення, які будуть програмно завантажуватися в об’єкт PictureBox, потрібно помістити у папку Debug відповідного проекту.
private void button1_Click(object sender, EventArgs e) { byte k; if (radioButton1.Checked) { k = 4; pictureBox1.Image = Image.FromFile("tetraedr.png"); } else if (radioButton2.Checked) { k = 6; pictureBox1.Image = Image.FromFile("cub.png"); } else if (radioButton3.Checked) { k = 8; pictureBox1.Image = Image.FromFile("oktaedr.png"); } else if (radioButton4.Checked) { k = 12; pictureBox1.Image = Image.FromFile("dodekaedr.png"); } else { k = 20; pictureBox1.Image = Image.FromFile("ikosaedr.png"); } label2.Text = "Кількість граней = " + k; }
Розглянемо ще один спосіб розв’язання задачі «Правильні многогранники» (рішення lesson_7, проект task_2_2). В даному розв’язку буде відсутня кнопка «Показати». Зображення та кількість граней фігури буде відображатися не після натиснення Кнопки, а одразу при зміні вибору фігури (рис. 7.6).
В першому способі розв’язання даної задачі ми помістили весь розв’язок в обробник події «натиснута кнопка» - button1_Click.
В момент, коли користувач змінює вибір в елементі управління Перемикач, створюється подія radioButton1_CheckedChanged. Написавши обробники такої події для кожного Перемикача ми реалізуємо другий спосіб розв’язання даної задачі, в якому результати будуть відображатися безпосередньо після вибору деякої фігури. В реалізації такого способу алгоритмічна структура розгалуження стає не потрібною.
private void radioButton1_CheckedChanged(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("tetraedr.png"); label2.Text = "Кількість граней = 4"; } private void radioButton2_CheckedChanged(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("oktaedr.png"); label2.Text = "Кількість граней = 6"; } private void radioButton3_CheckedChanged(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("oktaedr.png"); label2.Text = "Кількість граней = 8"; } private void radioButton4_CheckedChanged(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("dodekaedr.png"); label2.Text = "Кількість граней = 12"; } private void radioButton5_CheckedChanged(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("ikosaedr.png"); label2.Text = "Кількість граней = 20"; }
Для створення кожного з п’яти методів достатньо виконати подвійний клік на відповідному Перемикачі.
Розглянемо завдання, в якому, окрім Перемикачів, використовується елемент управління Прапорець.
Задача №3 – «Тіла обертання». Користувач може обрати одне з трьох тіл обертання: циліндр, конус, куля та вказати його розміри – радіус основи та висоту (для кулі лише радіус). Також користувач обирає, чи потрібно показувати малюнок обраної фігури. Після натиску на кнопку «обчислити», програма обчислює та виводить на екран об’єм даної фігури. Окрім обробника події «натиснута кнопка» потрібно реалізувати метод, який реагує на зміну вибору Перемикачів, показуючи або ховаючи поле для введення висоти фігури (рис. 7.7, 7.8).
Один із можливих варіантів розв’язання даної задачі наведено нижче:
private void button1_Click(object sender, EventArgs e) { double v; if (radioButton1.Checked) { int r = int.Parse(textBox1.Text); int h = int.Parse(textBox2.Text); v = Math.PI * r * r * h; pictureBox1.Image = Image.FromFile("1.png"); } else if (radioButton2.Checked) { int r = int.Parse(textBox1.Text); int h = int.Parse(textBox2.Text); v = 1.0 / 3 * Math.PI * r * r * h; pictureBox1.Image = Image.FromFile("2.png"); } else { int r = int.Parse(textBox1.Text); v = 4.0 / 3 * Math.PI * Math.Pow(r, 3); pictureBox1.Image = Image.FromFile("3.png"); } v = Math.Round(v, 3); label4.Text = v.ToString(); if (checkBox1.Checked) pictureBox1.Visible = true; else pictureBox1.Visible = false; } private void radioButton1_CheckedChanged(object sender, EventArgs e) { label2.Visible = true; textBox2.Visible = true; } private void radioButton2_CheckedChanged(object sender, EventArgs e) { label2.Visible = true; textBox2.Visible = true; } private void radioButton3_CheckedChanged(object sender, EventArgs e) { label2.Visible = false; textBox2.Visible = false; }
Розглянемо метод button1_Click детальніше. В ньому за допомогою вкладених розгалужень else – if визначаємо, яку фігуру обрав користувач; в кожній вітці розгалуження зчитуємо введені значення радіусу основи та висоти (для кулі лише радіусу) та визначаємо об’єм даної фігури за відповідною формулою. Поза розгалуженням заокруглюємо значення об’єму до трьох знаків після коми та виводимо його на екран.
Для обробки елемента управління прапорець використовуємо окреме розгалуження з умовою checkBox1.Checked:
if (checkBox1.Checked) pictureBox1.Visible = true; else pictureBox1.Visible = false;
Також в програмі реалізовано три методи для реагування на зміну користувачем вибору фігури (radioButton1_CheckedChanged, radioButton2_CheckedChanged, radioButton3_CheckedChanged). Результатом даних методів є поява або зникнення на екрані напису та поля для введення висоти фігури.
Для розгалуження алгоритму в залежності від вибору користувача окрім елементів Перемикач і Прапорець можна використовувати елемент Розкривний список (ComboBox) (рис. 7.9). Для зберігання елементів списку використовується властивість Items (рис. 7.10).
За замовчуванням після запуску програми в розкривному списку не вибрано жодного елемента. Для зміни вибраного за замовчуванням елемента списку потрібно в методі Form1_Load, який виконується в момент запуску програми прописати командний рядок:
comboBox1.SelectedIndex = N;
, де N – номер елемента списку, який потрібно відображати за замовчуванням, при чому нумерація елементів починається з нуля. Для створення методу Form1_Load достатньо двічі клікнути на вільному місці форми.
Для визначення вибраного користувачем елемента списку також використовується властивість SelectedIndex, наприклад:
if (comboBox1.SelectedIndex==2) { ...; }
Задача №4 – «Пори року». Елемент керування ComboBox дозволяє обрати одну з пір року; Прапорцем CheckBox можна встановити або відмінити повноекранний режим. Після натиску Кнопки «застосувати» змінюється фон та розмір форми. Кнопка «вихід» закриває програму. (рис. 7.11).
Для зручності, всі елементи керування помістимо в Контейнер Panel1. Пори року запишемо у властивість Items елемента ComboBox, додамо до панелі інші елементи.
В методі Form1_Load встановимо зиму порою року за замовчуванням:
private void Form1_Load(object sender, EventArgs e) { comboBox1.SelectedIndex = 0; }
Відповідно до встановленої за замовчуванням пори року змінимо фонове зображення форми (властивість BackgroundImage).
Основний код програми міститься в методі button1_Click (натиснута кнопка «застосувати»).
private void button1_Click(object sender, EventArgs e) { if (comboBox1.SelectedIndex == 0) this.BackgroundImage = Image.FromFile("winter.jpg"); else if (comboBox1.SelectedIndex == 1) this.BackgroundImage = Image.FromFile("spring.jpg"); else if (comboBox1.SelectedIndex == 2) this.BackgroundImage = Image.FromFile("summer.jpg"); else this.BackgroundImage = Image.FromFile("autumn.jpg"); if (checkBox1.Checked) { this.WindowState = FormWindowState.Maximized; this.FormBorderStyle = FormBorderStyle.None; } else { this.WindowState = FormWindowState.Normal; this.FormBorderStyle = FormBorderStyle.Sizable; } }
Для зміни фону вікна програми, в залежності від зробленого вибору в розкривному списку, використовується структура вкладених розгалужень if – else if. Фон форми завантажується з відповідних файлів за допомогою такого програмного рядка:
this.BackgroundImage = Image.FromFile("spring.jpg");
Нагадаємо, що всі зображення, які програмно завантажуються під час виконання проекту, повинні міститися в папці Рішення/Проект/bin/Debug.
Для обробки елемента управління Прапорець використовуємо розгалуження з умовою checkBox1.Checked. Команда this.WindowState = FormWindowState.Maximized; розвертає вікно на весь екран, а команда this.FormBorderStyle = FormBorderStyle.None; прибирає рамку та кнопки керування вікном.
Для виходу з програми можна використати команду this.Close();
Даний проект можна реалізувати без використання кнопки «застосувати» (рис. 7.12). Фоновий малюнок вікна буде мінятися після зміни вибору в розкривному списку, а розмір вікна – одразу після встановлення або зняття прапорця. Обидва методи можна утворити, виконавши подвійний клік на відповідних елементах ComboBox та CheckBox. Розглянемо програмний код для реалізації даного проекту (рішення lesson_7, проект task_4_2).
private void Form1_Load(object sender, EventArgs e) { comboBox1.SelectedIndex = 0; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBox1.SelectedIndex == 0) this.BackgroundImage = Image.FromFile("winter.jpg"); else if (comboBox1.SelectedIndex == 1) this.BackgroundImage = Image.FromFile("spring.jpg"); else if (comboBox1.SelectedIndex == 2) this.BackgroundImage = Image.FromFile("summer.jpg"); else this.BackgroundImage = Image.FromFile("autumn.jpg"); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked) { this.WindowState = FormWindowState.Maximized; this.FormBorderStyle = FormBorderStyle.None; } else { this.WindowState = FormWindowState.Normal; this.FormBorderStyle = FormBorderStyle.Sizable; } } private void button2_Click(object sender, EventArgs e) { this.Close(); }
Завдання №5 (рішення lesson_7, проект task_5). Відомо катети прямокутного трикутника. Скласти програму для обчислення гіпотенузи, периметра або площі трикутника в залежності від вибору користувача (рис. 7.13, 7.14).
Завдання №6 (рішення lesson_7, проект task_6). Створити програму «Світлофор», яка, в залежності від обраного кольору, відображає відповідний напис та зображення світлофору. Написи відображаються різними кольорами (рис. 7.15, 7.16).
Завдання №6_2 (рішення lesson_7, проект task_6_2). Розв’язати попередню задачу без використання кнопки «Показати». Зображення та відповідний напис повинні змінюватися одразу при зміні вибору кольору (рис. 7.17).
Завдання №7 (рішення lesson_7, проект task_7). Програма «Конвертор валют». Користувач задає кількість грошей у гривнях та обирає валюту, у яку він хоче конвертувати дану суму. Також користувач дає відповідь на запитання, чи потрібен йому чек. Програма здійснює конвертацію гривні в обрану валюту, відображає зображення відповідної валюти та за потреби чек (рис. 7.18, 7.19).
Завдання №8 (рішення lesson_7, проект task_8). Програма «одиниці вимірювання довжини». Скласти програму для переведення заданої довжини з вибраної одиниці вимірювання в метри (рис. 7.20, 7.21).
1 дюйм = 0,0254 метри; 1 миля = 1609,344 метри; 1 морська миля = 1852 метри; 1 фут = 0,3048 метри; 1 ярд = 0,9144 метри.
Завдання №9 (рішення lesson_7, проект task_9). Програма «розміри зображення». Скласти програму, яка змінює розміри зображення в залежності від вибору користувача. Користувач може обрати один з трьох запропонованих варіантів: маленьке, середнє, велике або вказати власні розміри зображення. (рис. 7.22).
маленьке - 150px х 100px; середнє - 300px х 200px; велике - 600px х 400px.