004 – Створення нової форми та підключення її до основної форми програми

Приклад створення нової форми та підключення її до основної форми в програмі


Зміст


Умова задачі

До основної форми Form1 додати нову форму в програмі Form2. В основній формі Form1:

  • створити кнопку “Show Form – 2” для виклику нової форми;
  • запрограмувати подію виклику нової форми;
  • вивести повідомлення у Form1 про результат повернення з нової форми Form2.

У новій формі Form2:

  • створити дві кнопки з назвами “OK” та “Cancel”;
  • запрограмувати реакцію форми на натиск мишкою (клавіатурою) на відповідній кнопці.

Схема взаємодії між формами зображена на рис. 1.

01_02_00_004_01u

Рис. 1. Схема взаємодії між формами

 

Виконання

1. Завантажити Embarcadero Delphi 2010. Створити проект за шаблоном VCL Forms Application

Детальний приклад створення нового проекту за шаблоном VCL Forms Application описується тут.

Зберегти проект та основну форму з іменем “MainForm” в деяку папку. Автоматично задається ім’я основної форми Form1 (властивість Name в Object Inspector).

 

2. Проектування основної форми Form1

Винести на основну форму компоненти типу TLabel та TButton. Відповідно імена компонент будуть Label1 та Button1.

У властивості “Caption” компонента Label1 заносимо текст “Result =”. У властивість “Caption” компонента Button1 заносимо текст “Show Form 2”.

Основна форма проекту має вигляд, зображений на рис. 2.

01_02_00_004_02_

Рис. 2. Основна форма

 

3. Додавання нової форми в проект

До проекту нова форма додається викликом послідовності команд (рис. 3):

File -> New -> Form Delphi

01_02_00_004_03_

Рис. 3. Додавання нової форми до проекту

У результаті, на екрані з’явиться нова пуста форма (рис. 4). Доступатись до властивостей та методів (процедур і функцій) цієї форми можна через ім’я Form2 за замовчуванням.

01_02_00_004_04_

Рис. 4. Новостворена форма з іменем Form2

В Object Inspector ім’я форми відображається у властивості Name. За бажанням можна змінити назву форми.

Зберегти нову форму у файлі можна командою

File -> Save All

Кожна нова форма зберігається в окремому файлі (модулі). За замовчуванням Delphi пропонує ім’я Unit2.pas. Залишимо ім’я без змін.

Крім модуля Unit2.pas, створюється файл опису форми Unit2.dfm.

Таким чином, маємо дві форми з такими іменами у програмі (властивість “Name”):

  • Form1 – основна форма (розміщується в модулі MainForm.pas);
  • Form2 – другорядна форма (розміщується в модулі Unit2.pas).

 

4. Налаштування вигляду нової форми

Для налаштування коректного вигляду нової форми (Form2) виконуємо такі дії.

  1. Виносимо на форму дві кнопки (компонент типу TButton) та одну мітку (TLabel). Отримуємо три змінні-компоненти з такими іменами: Button1, Button2, Label1.
  2. Властивість Caption компонента Button1 встановлюємо в значення “OK”.
  3. Властивість Caption компонента Button2 встановлюємо в значення “Cancel”.
  4. Властивість Caption компонента Label1 встановлюємо в значення “Form – 2”.

За бажанням можна налаштувати й інші властивості форми Form2.

Після внесених змін та корегування положення компонент на формі Form2 вікно нової форми матиме приблизно такий вигляд як зображено на рис. 5.

01_02_00_004_05_

Рис. 5. Вигляд дочірньої форми після корегування

 

5. Підключення форми 2 до модуля форми 1

Для того, щоб отримати результат повернення з форми 2 (Form2) або мати доступ до методів чи властивостей форми 2 потрібно підключити її до основної форми.

Це здійснюється з допомогою директиви uses на початку тексту модуля основної форми у розділі implementation.

...
implementation

uses Unit2;
...
end.

 

6. Виклик дочірньої форми з основної форми

Для виклику дочірньої форми (Form2) програмуємо подію кліку мишкою на кнопці “Show Form 2”.
Лістинг програмного коду цієї події наступний.

procedure TForm1.Button1Click(Sender: TObject);
var
  res:word;
begin
  // викликаємо дочірню форму
  res := Form2.ShowModal; 
  if res=mrOk then
    Label1.Caption := 'Result = OK'
  else
    Label1.Caption := 'Result = Cancel';
end;

Безпосередній виклик дочірньої форми здійснюється з допомогою функції ShowModal, яка повертає одне з двох значень (див. п. 7):

  • mrOk – означає, що у дочірній формі Form2 натиснута кнопка “OK”;
  • mrNo – означає, що у дочірній формі Form2 вибрано “Cancel”.

 

7. Програмування подій в формі 2

Основною задачею є визначення того, яку кнопку натиснув користувач у дочірній формі Form2. Від цього залежить виконання програми. Наприклад, якщо вибрана кнопка “OK” то це може означати виконання якихось дій (читання з файлу, виведення на друк і т.д.).

У нашому випадку програмуємо дві події у модулі форми 2 (Unit2.pas):

  • клік мишкою на кнопці “OK” (Button1);
  • клік мишкою на кнопці “Cancel” (Button2).

Лістинг програмного коду обробки цих подій має вигляд.

procedure TForm2.Button1Click(Sender: TObject);
begin
  // закриття форми з кодом повернення mrOk
  ModalResult := mrOk; 
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  // закриття форми з кодом повернення mrNo
  ModalResult := mrNo; 
end;

Зовнішня глобальна змінна ModalResult форми Form2 визначає поведінку форми. Як тільки ModalResult стає рівним ненульовому значенню (mrOk або mrNo), то форма закривається з відповідним кодом повернення.

У результаті виклику з основної форми функції

Form2.ShowModal;

дочірня форма 2 буде відображатись на екрані до тих пір, поки користувач не закриє її стандартними засобами Windows або не натисне одну з двох кнопок “OK” або “Cancel”.

Якщо користувач вибрав кнопку “OK”, то ShowModal (див. п.6) поверне значення mrOk. В іншому випадку ShowModal поверне значення mrNo.

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

 

Висновок

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

  1. Створення дочірньої форми (File -> New Form).
  2. Підключення дочірньої форми до основної форми (uses Unit2).
  3. Виклик (відображення) дочірньої форми з основної форми (ShowModal) та обробка результату повернення.
  4. Обробка подій підтвердження (не підтвердження) виконаної роботи в дочірньій формі з допомогою глобальної змінної ModalResult.


Зв’язані теми