
2. Створення нового проекту
Почати новий проект можна декількома способами, наприклад командами File/New/Applicaiion або File/New/Other. При виборі останньої команди відкривається вікно NewItems (нові елементи). Це вікно є вітриною Депозитарію об'єктів (Object Repository) — сховища зразків компонентів, форм і проектів. Відкрити новий проект можна, клацнувши на піктограмі Applicaiion (додаток), розташованій на сторінці New (новий). Піктограма Application створює звичну програму з порожньою формою. Можна також скористатися і деякими іншими варіантами додатків, піктограми яких розташовані на сторінці Projects.
Можливість користуватися Майстром Додатків або готовими проектами з Депозитарію виглядає, безумовно, привабливою. Але я б не радив захоплюватися цими можливостями. Користуючись ескізами додатків і форм, ви завжди ризикуєте, що в них опиняться якісь не помічені вами особливості, які не дозволять програмі працювати так, як вам хотілося б. Коли ви освоїтеся з C++Builder, краще за все, розробляти програми самому, починаючи з порожньої форми. А проекти з Депозитарію, так само як і приклади, що поставляються з C++Builder, корисно подивитися, вивчити, випробувати, перенести якісь прийоми програмування в свої програми, але не більш того.
3. Збереження проекту
Перша дія, яку рекомендується виконати після створення нового проекту, — зберегти його. Якщо ви починаєте роботу з того, що зберігаєте проект, і надалі регулярно повторюєте збереження, то можете не побоюватися будь-яких несподіванок типу збою комп'ютера або середовища C++Builder, викликаних технічними причинами або неприпустимими власними діями. Але є і ще аргумент на користь негайного збереження проекту і модулів. У багатовіконних програмах, це дозволяє відразу задати модулям імена, які використовуватимуться в програмі для взаємних посилань модулів один на одного. Якщо ви не виконали відразу збереження форми, то вимушені спочатку посилатися на її ім'я за умовчанням, а надалі змінювати ці посилання.
Завжди зберігайте проект під якимсь осмисленим ім'ям, змінюючи тим самим ім'я проекту, задане C++Bjilder за умовчанням. Інакше дуже скоро ви заплутаєтеся в нескінченних програмах Project1, які зберігаються в різних каталогах. До того ж врахуйте, що ім'я файлу проекту буде в подальшому ім'ям виконуваного модуля.
Зберегти проект можна командою File/SaveAll. Зручно також використовувати відповідну швидку кнопку. При першому збереженні C++Builder запитає у вас ім'я файлу модуля, що зберігається, а потім — ім'я файлу проекту. C++Builder не допускає однакових імен модулів і проектів. Це природно, оскільки файли модуля і головний файл проекту мають однакове розширення .срр і, значить, повинні розрізнятися іменами, щоб не затерти на диску один одного.
4. Структура головного файлу проекту
В процесі проектування програми C++Builder автоматично створює коди головного файлу проекту, коди окремих модулів і коди їх заголовочних файлів. Головний файл проекту містить функцію WinMain. У інші модулі вводиться власний код обробників різних подій. У заголовочні файли цих модулів вводяться власні оголошення. Але головний модуль, як правило, скритий. Тільки у виняткових випадках у ньому треба змінювати згенерований код.
Щоб побачити код головного файлу проекту, треба виконати команду Project/ViewSource. Типовий головний файл (Project1.cpp) проекту може мати наступний вигляд:
Лістинг 1
//головний файл Project1.cpp-----------------------------------------------
//директиви препроцесора
#include <vcl.h>
#pragma hdrstop
//макроси, що підключають файли ресурсів і форм
//-------------------------------------------------------------------
USERES("Projectl.res");
USEFORM("Unit1.cpp", Form1);
USEF0RM{"Unit2.cpp", Form2);
//функція main
//-------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
Починається файл головного модуля рядками, перший символ яких – “#”. З цього символу починаються директиви препроцесора. Серед них найбільш важливі - директиви #include. Ці директиви підключають в даний файл тексти вказаних в них файлів. Зокрема, подібними директивами включаються в текст заголовочні файли. Наприклад, директива #include <vcl.h> підключає заголовний файл vcl.h, що містить оголошення, які використовуються в бібліотеці візуальних компонентів C++Builder.
Після директив препроцесора у файлі розміщені назви макросів USERES і USEFORM, які використовуються для підключення до проекту файлів форм, ресурсів та ін. Препроцесор розгорне ці макроси у відповідний код. В даному випадку ви можете бачити два макроси USEFORM, що підключають форми. C++Builder автоматично формує відповідний код з макросом USEFORM для кожної форми, що додається до проекту. Перший параметр макросу містить ім'я файлу модуля, відповідного формі (наприклад, «Unit1.cpp»), а другий параметр — ім'я форми.
Після всіх цих допоміжних секцій у файлі розташована головна функція програми — WinMain. Її першим параметром є дескриптор даного екземпляра програми. Дескриптор — це унікальний покажчик, який дозволяє ОС Windows розбиратися в безлічі одночасно відкритих вікон різних програм. Іноді дескриптори використовуються при зверненні до різних функцій API Windows (API Windows — це призначений для користувача інтерфейс Windows). Другий параметр WinMain — дескриптор попереднього екземпляра вашої програми (якщо користувач виконує одночасно декілька таких програм). Третій параметр є покажчиком на рядок з нульовим символом в кінці, що містить параметри, які передаються в програму через командний рядок. Іноді такі параметри використовуються для перемикання режимів роботи програми або для завдання різних опцій при запуску програми з диспетчера програм або функцією WinExec. Останній параметр визначає вікно програми. Цей параметр може надалі передаватися у функцію ShowWindow.
Всі ці параметри функції WinMain використовуються достатньо рідко, так що поки можете не прагнути розбиратися в їх призначенні.
Після заголовка функції WinMain слідує її тіло, поміщене у фігурні дужки. Перший виконуваний оператор тіла функції — Application—>Initialize() ініціалізує об'єкти компонентів даної програми. Подальші оператори Application—>CreateForm() створюють об'єкти відповідних форм. Форми створюються в тій послідовності, в якій слідують ці оператори. Перша із створюваних форм є головною.
Наступний оператор — Application—>Run() починає виконання програми. Після цього оператора програма чекає відповідних подій, які і управляють її ходом.
Перераховані оператори тіла функції WinMain поміщені в блок try, після якого слідує блок catch. Це структура, пов'язана з обробкою так званих виключень, — аварійних ситуацій, що виникають при роботі програми. Якщо така аварійна ситуація виникне, то будуть виконані оператори, розташовані в блоці catch. За умовчанням в цьому блоці розташований стандартний обробник виключень за допомогою функції Application—>ShowException().
Останнім оператором тіла функції WinMain є оператор return(0), що завершує проект з кодом завершення 0.
Всі описані вище оператори головного файлу проекту заносяться в нього автоматично в процесі проектування програми і без крайньої потреби змінювати у ньому нічого не треба.