Робота з формами Lazarus
Відкриття форм у модальному режимі
Найбільш очевидним застосуванням програмного відкриття додаткової форми є вибір або пошук будь-якого значення у довіднику з подальшим поверненням, наприклад коду знайденого елемента в основну форму. Таку форму треба відкривати модально, тому що немає сенсу продовжувати виконання основної програми, поки не зроблено вибір і форма не закрита. Спробуймо це реалізувати.
Як приклад створимо новий проект і на головну форму помістимо пару полів введення та кнопок:

Як тестове завдання будемо відкривати додаткову форму з полем введення, в якому спочатку повинен бути текст з відповідного поля введення головної форми. Далі передбачимо зміну цього тексту та повернення оновленого значення у головну форму. Для цього спочатку створимо додаткову форму приблизно такого виду:

Як програмний інтерфейс для передачі параметра будемо використовувати властивість TestValue, яке визначимо в секції public класу форми. Також визначимо і реалізуємо більш ніж очевидні методи для встановлення та зчитування значення властивості, а також обробник події натискання на кнопку, в якій властивості форми ModalResult присвоюється значення mrOK, що призводить до закриття (але не знищення!) форми.
Однак найбільший інтерес представляє функція RunTestForm. Як можна помітити, вона визначена поза класом форми, хоча й у тому модулі. Це може здатися дивним програмістам VB, де модуль класу повністю ототожнюється із самим класом. Як і в Delphi, у Lazarus це не так. Хоча в одному модулі можна визначити лише одну форму (інакше візуальний дизайнер форм не зможе працювати), інші елементи програми не обов'язково реалізовувати окремо. У нашому випадкуфункція RunTestForm містить код, необхідний для створення форми, передачі початкового значення поля введення та повернення відредагованого значення. Очевидно, що RunTestForm за змістом пов'язана з класом форми, тому буде розумно (хоча й зовсім не обов'язково) розташувати її в модулі форми.
Тепер подивимося, як використовувати все це в основній формі. Додамо в обробники подій натискання на кнопки виклики функції RunTestForm, в результаті чого розділ реалізації модуля головної форми набуде такого вигляду:
Відкриття форм у немодальному режимі
Отже, спершу визначимося, що призначення, поведінка немодальної форми та принципи роботи з нею зовсім інші. Насамперед, немодальні форми не пристосовані повернення значень, оскільки після їх відкриття програма не зупиняється в очікуванні закриття форми, а продовжує виконуватися. Через це, якщо не вжити спеціальних заходів, покажчик на форму буде втрачено після завершення роботи коду, який її створює (у нашому випадку - це функція RunTestForm). Чи це так жахливо? У більшості випадків – ні. Пам'ятайте, що при створенні екземпляра форми конструктор передавався параметр Application? Так ось: Application - це об'єкт, який представляє весь наш додаток. При такому створенні форми він пам'ятатиме про її присутність, а ми зможемо скористатися цим. Створимо в головній формі список, який заповнюватимемо іменами форм, відкритих у додатку. Основна форма при цьому дещо зміниться і виглядатиме приблизно так:

Зверніть увагу, що ми задекларували новий метод FillWindowsList, який і виконує заповнення списку форм програми. Його реалізація не надто складна: тут є якийсь цікавий момент. Справа в тому, що об'єкт Applicationмістить єдиний список всіх компонентів, якими володіє, тому доводиться перевіряти, що черговий компонент є саме TForm.
Однак, що користь просто виводити список форм. Потрібно зробити так, щоб можна було перейти на будь-яку з них. У реальному додатку це, звичайно, краще зробити за допомогою меню, але код вийде дещо громіздкішим, тому в нашому простому прикладі по-перше використовуватимемо список, а по-друге опустимо необхідні в реальному додатку перевірки. Нижче наведено весь код секції реалізації модуля основної форми. Зверніть увагу, що викликаючи метод RunTestForm ми вже не чекаємо значення, що повертається, але зате викликаємо процедуру заповнення списку вікон програми.
Тепер створимо додаткову форму, яку відкриватимемо з головної форми в немодальному режимі. Зовні вона нічим не відрізнятиметься від розглянутої в попередньому розділі модальної форми, а ось код дещо зміниться. Зауважте, що властивість TestValue тепер тільки для запису, а метод RunTestForm став процедурою замість функції.
З'явилася і нова глобальна змінна – лічильник форм Form2Count. Вона знадобиться нам, коли створюваному екземпляру форми ми будемо надавати ім'я. Всі об'єкти програми повинні мати унікальні імена, проте LCL про це ніяк не дбає, тому доведеться діяти самостійно. Код, пов'язаний зі змінною Form2Count, досить тривіальний, тому зупинятися на ньому не будемо.
Реалізація також досить сильно змінилася. Показ форми тепер здійснюється викликом методу Show, а не ShowModal, тому виконання програми не передається у форму до її закриття, а триває. Про закриття та звільнення ресурсів тепер має дбати сама форма. Для цього у процедурі обробки подіїЗакриття форми ми надамо змінній CloseAction значення caFree. Натискання кнопки тепер викликає не встановлення значення ModalResult, а явне звернення до методу Close.
Якщо Ви не просто читали цю статтю, а створювали попутно описану тестову програму, саме час її запустити. Тільки знову не забудьте прибрати додаткову форму зі списку програм, що автоматично створюються при старті.