C#. Windows Forms. Приклад створення немодальної форми у Windows Forms додатку. Модальні та немодальні вікна

Приклад створення немодальної форми у Windows Forms додатку. Модальні та немодальні вікна

1. Загальні відомості про модальні та немодальні форми

Будь-яка більш-менш серйозна програма використовує діалогові вікна для організації інтерфейсу з користувачем. В графічному інтерфейсі операційної системи Windows розрізняють два види діалогових вікон:

  • модальні вікна;
  • немодальні вікна.

Модальні вікна є найбільш поширеним видом вікон. Якщо відкрите модальне вікно, то щоб попасти в основну програму, його обов’язково потрібно закрити. Без закриття модального вікна неможливо перейти в програму, яка його викликала. У програмах Windows Forms можлива ситуація, коли одне модальне вікно відкриває інше (наступне) модальне вікно. Таким чином утворюється ланцюг викликів.

Як правило, модальне вікно містить кнопки типу OK, Cancel (або інші), при натиску на яких це вікно закривається.

Прикладом модального вікна може бути команда Open… редактора Microsoft Word, яка відкриває вікно вибору файлу. Поки не буде вибрано файл або не буде натиснута одна з кнопок відміни, перейти в редактор не вдасться.

При відкритті немодального вікна, існує можливість перемикатись з вікна в основну програму не закриваюче це вікно, і, навпаки, з основної програми можна знову повернутись у немодальне вікно. Але при цьому, візуально немодальне вікно завжди розміщується над основною програмою. Як правило, немодальне вікно містить одну кнопку типу Close, яка його закриває.

Приклад немодального вікна – це команда “Insert Symbol” редактора Microsoft Word, яка дозволяє вставляти символ у документ. З вікна вставки символа можна перемикатись в основний документ і навпаки, з документа можна переходити в немодальне вікно.

 

2. Особливості роботи з немодальними вікнами у Windows Forms

У технології Windows Forms основній програмі відповідає форма – екземпляр класу, успадкованого від класу Form. Так само модальному або немодальному вікну відповідає деяка форма.

При роботі з немодальними вікнами було помічено наступні особливості:

  • у немодальному вікні є одна кнопка Close, яка його закриває;
  • виклик немодального вікна з головної програми відбувається в методі Show() класу Form (щоб викликати модальне вікно потрібно використати метод ShowDialog()).

У нижченаведеному коді наведено приклади виклику модального та немодального вікна

// 1. Виклик модального вікна
dlgResult = modalForm.ShowDialog();

// Обробка результату повернення, що розміщується в dlgResult
// ...

// 2. Виклик немодального вікна
nonModalForm.Show(); // тут не потрібно нічого обробляти

Як видно з вищенаведеного коду, проблемою є спосіб обміну інформацією між основною програмою та немодальним вікном. Основній програмі відповідає головна форма, немодальному вікну відповідає немодальна форма.

 

3. Способи обміну інформацією між головною формою та немодальною формою

При використанні немодальних форм важливим є обмін інформацією між основною програмою (головною формою) та немодальною формою.

Тут можливі дві ситуації:

  • передача інформації з головної форми в немодальну. Ця ситуація вирішується без проблем, оскільки в основній формі створюється екземпляр немодальної форми. Через цей екземпляр здійснюється доступ до компонент немодальної форми стандартним способом;
  • передача інформації з немодальної форми в головну форму. Тут виникає проблема: як з немодальної форми доступитися до екземпляру головної форми.

Щоб передати дані (інформацію) з немодальною форми в головну, можна використати один з наступних способів:

  1. З допомогою статичного посилання на головну форму. Як відомо, статичні змінні є глобальними, тому зручно можуть використовуватись для обміну інформацією між різними розділеними екземплярами чи процесами. Маючи посилання на головну форму, можна легко звертатися до компонент цієї форми. Цей спосіб є найпростіший.
  2. З допомогою механізму подій. При цьому способі в немодальній формі оголошується подія, яка виникає кожен раз, коли головній формі потрібно передати інформацію. Проте, сам обробник цієї події міститься в головній формі. Якщо з немодальної форми потрібно передати інформацію головній формі, то виникає подія. У результаті, в головній формі викликається обробник цієї події. Цей обробник отримує об’єкт типу “немодальне діалогове вікно”, що згенерував подію. Маючи доступ до зміненого об’єкту немодального вікна, можна оновити інформацію в головній формі.
  3. З допомогою запису інформації у тимчасовий файл. Як відомо, файли є подібні до статичних змінних. Тому, записавши порцію інформації у файл в немодальній формі, можна її зчитати в головній формі. Цей спосіб не є ефективним, оскільки працює повільніше (читання з носіїв інформації відбувається довше ніж з оперативної пам’яті).

 

4. Приклад розробки демонстраційної програми використання немодальної форми

У даній темі описується приклад створення та використання немодальної форми. Для передачі інформацїі з немодальної форми в головну форму використовуєтсья спосіб використання статичного посилання на головну форму. При цьому способі, перед викликом немодальної форми запам’ятовується значення екземпляру головної форми у статичній змінній. Якщо потрібно передати інформацію з немодальної форми у головну форму, то відбувається звертання до статичної змінної.

Демонстраційна програма складається з двох форм: головної та немодальної. З головної форми викликається немодальна форма. З немодальної форми відбувається копіювання інформації з поля вводу у відповідне поле вводу головної форми.

4.1. Створити проект типу Windows Forms

Після створення проекту за шаблоном Windows Forms автоматично створюється головна форма, екземпляр якої має ім’я Form1.

4.2. Розробка основної форми

Створити основну форму та розмістити на ній наступні елементи управління:

  • елемент управління типу Button. Створюється екземпляр кнопки з іменем button1;
  • елемент управління типу Label. Створюється екземпляр мітки з іменем label1;
  • елемент управління типу TextBox. Створюється екземпляр поля вводу з іменем textBox1.

Налаштувати властивості форми та елементів управління як показано на рисунку 1:

  • в елементі управління Form1 властивість Text = “Main Form” (в подальшому Form1.Text);
  • button1.Text = “Show Modeless Form”;
  • label1.Text = “Text”;
  • textBox1.Modifiers = Public. Значення Public необхідне, щоб цей елемент управління був видимий з немодальної форми.

Також потрібно відкорегувати розміри головної форми.

Після налаштування головна форма матиме вигляд як показано на рисунку 1.

C#. Windows Forms. Створення немодальної форми. Головна форма програми

Рисунок 1. Головна форма програми

 

4.3. Створити нову форму Form2

Створення нової форми здійснюється стандартним способом з допомогою команд

Project -> Add Form (Windows Forms...)

У вікні, що відкриється, потрібно вказати шаблон “Form (Windows Forms)”. Ім’я файлу залишити за замовчуванням Form2.cs. У результаті буде створено екземпляр форми з іменем Form2.

 

4.4. Проектування форми Form2

Розмістити на формі Form2 наступні елементи управління:

  • один елемент управління типу Label. Буде створено об’єкт з іменем label1;
  • два елементи управління типу Button. Буде створено два об’єкти з іменами button1, button2;
  • один елемент управління типу TextBox. Буде створено екземпляр з іменем textBox1.

Налаштувати наступні властивості елементів управління форми Form2:

  • Form2.Text = “Modeless Form”;
  • button1.Text = “Copy to Form1”;
  • button2.Text = “Close”;
  • label1.Text = “Text”;
  • textBox1.Modifiers = Public.

Після налаштування немодальна форма матиме вигляд як показано на рисунку 2.

C#. Windows Forms. Немодальна форма після налаштування елементів управління

Рисунок 2. Немодальна форма Form2 після налаштування елементів управління

 

4.5. Ввід статичної змінної-посилання на форму Form1

У тексті класу Form1 потрібно ввести статичну змінну з іменем form1:

...

public partial class Form1 : Form
{
  // Посилання на поточний екземпляр головної форми - зберігаємо
  // у статичній змінній, яка є доступна з усієї програми
  public static Control form1;

  public Form1()
  {
    InitializeComponent();
  }
}

...

Статична змінна має тип Control. Усі елементи управління породжені з класу Control. Те саме стосується і форми.

 

4.6. Програмування обробника події Click елемента управління button1 форми Form1

При натиску на кнопці button1 (Show Modeless Form) відкривається вікно немодальної форми і в поле вводу немодальної форми (Form2.textBox1.Text) вписується текст з поля вводу головної форми (Form1.textBox1.Text).

Щоб виконати цей пункт спершу потрібно активувати форму Form1. Потім потрібно запрограмувати подію Click елемента управління button1, що розміщений на формі Form1.

Текст обробника події наступний:

// Обробник події Click елемента управління button1.
// Виконує наступні дії:
// - викликає немодальну форму;
// - у textBox1 записується текст з форми Form1.
private void button1_Click(object sender, EventArgs e)
{
  // 1. Оголосити екземпляр немодальної форми
  Form2 f2 = new Form2();

  // 2. Записати у статичну змінну form1 поточний екземпляр
  form1 = this;

  // 3. Відобразити немодальну форму
  f2.Show();

  // 4. Записати в Form2.TextBox1 текст з рядка основної форми
  f2.textBox1.Text = this.textBox1.Text;
}

 

4.7. Програмування обробника події Click кнопки button1 форми Form2

При натиску на кнопці button1 (Copy to Form1) текст з поля вводу немодальної форми (Form2.textBox1.Text) повинен скопіюватись у відповідне поле вводу головної форми (Form1.textBox1.Text).

Спершу потрібно активувати форму Form2 та сформувати обробник події Click елементу управління button1.

Текст обробника події наступний:

...

// У цьому обробнику виконуються наступні операції:
// - вміст Form2.textBox1 копіюється в Form1.textBox1
private void button1_Click(object sender, EventArgs e)
{
  // Отримати елемент управління textBox1 основної форми.
  // Для реалізації цього здійснюється обхід всіх елементів
  // управління основної форми.
  for (int i = 0; i < Form1.form1.Controls.Count; i++)
  {
    // Перевірка, чи не textBox1
    if ((Form1.form1.Controls[i] is TextBox)&&
      (Form1.form1.Controls[i].Name == "textBox1"))
    {
      // то записати в нього текст з Form2.
      Form1.form1.Controls[i].Text = this.textBox1.Text;
      break;
    }
  }
}

...

В обробнику події на основі статичного посилання form1 відбувається циклічний пошук елементу управління типу TextBox, який має ім’я textBox1 (про всяк випадок, якщо в головній формі декілька textBox-ів).

 

4.8. Програмування обробника події Click елементу управління button2

При натиску на кнопці button2 потрібно закрити немодальну форму. Текст відповідного обробника наступний:

...

// Закрити немодальну форму
private void button2_Click(object sender, EventArgs e)
{
  this.Close();
}

...

Як видно з вищенаведеного коду, немодальна форма закривається так само як і модальна.

 

4.9. Запуск програми на виконання

Після проходження інструкції, можна запускати програму. Під час виконання програми з допомогою кнопки “Show Modeless Form” можна викликати декілька немодальних форм з головної форми (рисунок 3). При цьому з другорядних немодальних форм можна передавати інформацію в головну програму по черзі.

C#. Windows Forms. Немодальна форма. Виклик з форми 4 немодальних форм

Рисунок 3. Випадок, коли з головної форми викликано 4 немодальних форми


 

0
fb-share-icon20