Лістинг 9.1. Вихідний код проекту:
MainUnit in 'MainUnit.pas1; begin
Application.Initialize; Application.CreateForm (TFormi, Forml); Application.Run; end.
Все це не що інше, як вміст файлу SplashProject.dpr. Першим рядком стоїть ім'я програми program SplashProject. У цьому рядку нічого міняти не можна, тому що ім'я файлу повинна збігатися з написаним тут ім'ям програми. Після цього йде вже знайомий розділ uses, в якому можна підключати необхідні модулі. У нас підключені модулі Forms (дозволяє працювати з формами) і MainUnit (модуль головного вікна). Якщо у вашій програмі кілька вікон, то всі вони автоматично прописуються тут в розділ uses, тому що в цьому файлі описано ініціалізація вікон, і він повинен знати про існування всіх вікон в програмі. Якщо якесь вікно инициализируется не автоматично, то тільки в цьому випадку ви можете прибрати модуль цього вікна з підключення uses, інакше при компіляції відбудеться помилка.
Між begin і end виконуються три рядки.
Application.initialize - запускає ініціалізацію додатки. Прибирати не рекомендується.
Application.CreateForm (TForm1, Form1) -метод CreateForm инициализирует форму. У нього два параметри - ім'я об'єкта і ім'я змінної, яка згодом буде вказувати на створений об'єкт. У нашому випадку це ім'я форми TForm1 і ім'я змінної Form1. Мінлива Form1 автоматично описується в модулі об'єкта TForm1 (в нашому випадку це модуль
MainUnit .pas) в розділі var:
Application.Run - після ініціалізації всіх форм можна запускати виконання програми ЗА ДОПОМОГОЮ методу Run об'єкта Application.
Тут всюди використовується об'єкт Application. Цей об'єкт завжди існує в ваших програмах в єдиному екземплярі і створюється за допомогою рядка Application.initialize. З цим об'єктом ми буде знайомитися поступово протягом всієї книги, а зараз досить знати, що він походить від класу TAppiication і реалізує основні функції управління додатком.
Тепер створіть нову форму, вибравши меню File | New | Form. і збережіть її під ім'ям spiashunit.pas. Знову подивіться на вихідний код проекту, він повинен бути таким, як показано в лістингу 9.2.
program SplashProject; uses
MainUnit in 'MainUnit.pas', SplashUnit in 'SplashUnit.pas 1;
Application.Initialize; Application.CreateForm (TForml, Forml); Application.CreateForm (TForm2, Form2); Application.Run; end.
Тепер увійдіть в властивості проекту (з меню Project (Проект) потрібно вибрати пункт Option (Параметри)). На вкладці Forms (Форми) в списку Auto-create forms (Автосоздаваемие форми) у нас описано дві форми. Виділіть Form2 (ця друга форма, яку ми тільки що створили) і перемістіть її в список Available forms (Доступні форми). Закрийте вікно властивостей кнопкою ОК і подивіться на вихідний код проекту. Ви можете помітити, що рядок ініціалізації другий форми зникла. Це тому, що ми перенесли її зі списку автоматично створюваних форм в список доступних форм. Тобто наша форма доступна в проекті, але не створюється автоматично при старті програми. Таким чином, щоб використовувати Form2, ми її повинні спочатку створити.
Щоб далі було зручніше працювати, перейменуйте головну форму Forml в MainForm, а другу форму Form2 в spiashForm. Так ми не будемо плутатися, де головна форма, а де форма-заставка. Встановіть на головну форму кнопку і за її натисканні напишіть наступний код:
procedure TMainForm.ButtonlClick (Sender: TObj ect); begin
Тут в першому рядку коду ми инициализируем форму SplashForm. У другій - створене вікно виводиться на екран. І в останньому рядку відбувається знищення Вікна методом Free.
Але є ще один спосіб створення вікон, який ми вже використали, і він краще. Напишіть наступний код:
procedure TMainForm.ButtonlClick (Sender: TObject);
SplashForm: = TSplashForm. Create (Owner);
Тут змінної SplashForm присвоюється результат виклику методу create об'єкта TSpiashForm. Цьому методу потрібно передати тільки один параметр - власника вікна. Якщо власника немає, то можна передавати nil (нульове значення вказує на відсутність власника). У нашому випадку передається Owner - властивість, в якому зберігається покажчик на поточне вікно. Якщо головним вікном повинно бути не поточне вікно, то потрібно вказати ім'я об'єкта - Form1.owner.
Давайте зробимо так, щоб наше вікно SplashForm з'являлося на час завантаження програми. Подібні вікна ви бачите при старті таких програм, як Delphj. Word. Excel та інших програм. Для цього треба зайти в вихідний код проекту і подкорректируйте так, щоб він відповідав коду, наведеному в лістингу 9.3.
Application. CreateForm (TMainForm, MainForm);
Розглянемо цей код за рядком.
- Створюється вікно spiashForm. У цього вікна не буде власника, тому що воно показується навіть до того, як створено головне вікно. Тому в якості параметра методу create ми вказуємо значення nil.
- Відображаємо вікно на дисплеї не модально, щоб вікно відобразилося, а програма залишалась активною.
- Перемальовування вікна за допомогою виклику методу Repaint.
- Ініціалізація програми.
- Створюється головна форма TMainForm.
- Робимо затримку, щоб вікно SpiashForm могло хоч трохи "зависнути" на екрані. Для цього ми використовуємо процедуру sleep, а в якості параметра вказується час затримки в мілісекундах. Одна секунда дорівнює 1000 мілісекунд. Для використання цієї функції в розділ uses потрібно додати модуль
- Windows.
- Ховаємо форму SpiashForm викликом методу Hide.
- Знищуємо вікно.
- Запускаємо програму.
Запустіть програму, і ви спочатку побачите вікно SpiashForm (на нього поміщений текст TLabel з написом "Триває завантаження"), а потім вже з'явиться головне вікно.
ПОРАДА. Коли створюються вікна (викликаються CreateForm), програма виконує обробники події oncreate всіх створюваних форм. Якщо у вас додаток занадто велике і операції в цих обробниках виконуються тривалий час, то бажано показувати інформацію про хід виконання цих операцій в вікні SpiashForm. В цьому випадку в першу чергу створюється саме це вікно, і воно відображається на екрані. Користувач бачить, що йде завантаження, і спокійно чекає її закінчення.
Коли инициализируется форма, то в цей момент викликається її конструктор. Якщо у вас в проекті 20 форм і конструктор кожної з них виконує якісь довгі за часом операції, то створюється відчуття, що програма зависла. Необхідно або оптимізувати код для підвищення швидкості завантаження програми, або інформувати користувача про те, що програма не варто, а йде завантаження.
Якщо ви не будете інформувати про хід завантаження, і на екрані нічого з'являтися не буде, то користувач може подумати, що програма зависла, і спробувати запустити її ще раз. Це в свою чергу може привести до краху всього обчислювального процесу. Наприклад, спроба запустити двічі програму, яка працює з СОМ-портом. У цьому випадку друга копія вже не зможе відкрити порт (СОМ-порт можна відкрити тільки один раз). Тому краще зайвий раз створити вікно з відображенням ходу завантаження, ніж вислуховувати невдоволення користувачів з приводу роботи вашої програми.
Як можна збільшити швидкість завантаження? Відразу напрошуються наступні варіанти.
Ініціалізувати тільки основні форми. Дуже гарна ідея. Нема чого форматувати 150 форм, коли з них буде реально використовуватися не більше 10, а решта якщо і будуть викликатися, то дуже рідко. Це зайві втрати часу при завантаженні і витрати пам'яті під час роботи. Нехай у вас автоматично створюються тільки необхідні форми. Виконувати всі операції в обробнику події Onshow. Логічне рішення, адже при ініціалізації форми викликається її конструктор і обробник події oncreate, а значить, якщо ці методи будуть виконуватися швидко, то і завантаження програми прискориться. Але якщо перенести код в обробник події onshow, то будуть передбачати певну затримку відображення вікна, причому при кожному відображенні. Можна ухитритися і перевіряти в Onshow, якщо ініціалізація вже була, то пропустити цей код і просто відобразити вікно.
Другий варіант непоганий, але не забувайте, що MDI-вікна створюються відразу бачимо, тому якщо ВОНИ В списку AutoCreate, то під час завантаження програми для таких вікон буде викликаний як конструктор, так і відображення вікна, т. Е. І обробник OnShow.
Formstyle на fsMDichild, то властивість visible теж автоматично стає рівним true.
Враховуйте цей нюанс. Якщо ви випадково зробили вікно дочірнім, а потім поміняли назад на fsNormai, то після запуску це вікно відразу ж відобразиться на екрані (якщо форма в списку автоматично створюваних), тому що властивість visible залишиться рівним істині.