
5. Структура файлів модулів форм
Кожен модуль складається з двох файлів: заголовочного, що містить опис класу форми, і файлу реалізації. Нижче приведені тексти цих файлів модуля форми, на якій розміщена одна мітка (компонент типу TLabel) і одна кнопка (компонент типу TButton). Докладні коментарі в цьому тексті пояснюють, куди і що в цей код ви можете додавати.
Заголовочний файл:
Лістинг 2
//заголовочний файл unit1.h -----------------------------------------
#ifndef UNIT1H
#define UNIT1H
//-------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//сюди можуть поміщатися додаткові директиви препроцесора (зокрема, include)
//що не включаються у файл автоматично
//-------------------------------------------------------------------
//оголошення класу форми Tform1
class Tform1 : public TForm
{
__published: //IDE-managed Components
//розміщені на формі компоненти
TButton *Button1;
TLabel *Label1;
void _ fastcall Button1Click{TObject *sender);
private: //User declarations
// закритий розділ класу
// сюди можуть поміщатися оголошення типів, змінних, функцій
// що включаються в клас форми, але не доступних для інших модулів
public: // User declarations
// відкритий розділ класу
//сюди можуть поміщатися оголошення типів, змінних, функцій
//що включаються в клас форми і доступних для інших модулів
__fastcall TForml{TComponent* Owner);
};
//---------------------------------------------------------
extern PACKAGE Tform1 *Form1;
//---------------------------------------------------------
// сюди можуть поміщатися оголошення типів, змінних, функцій
// які не включаються в клас форми;
// доступ до них з інших блоків можливий тільки при дотриманні деяких додаткових умов
#endif
Файл реалізації:
Лістинг 3
//файл реалізації unit1.cpp -------------------------------
#include <vcl.h>
#pragma hdrstop
#include "unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
// сюди можуть поміщатися додаткові директиви препроцесора (зокрема, include),
// що не включаються у файл автоматично
// оголошення об'єкту форми Form1
TForml *Forml;
//-------------------------------------------------------------------
// виклик конструктора форми Form1
__fastcall Tform1::Tform1(TComponent* Owner)
:TForm(Owner}
{
//сюди ви можете помістити оператори, які повинні виконуватися при створенні форми
}
//-------------------------------------------------------------------
//сюди можуть поміщатися оголошення типів і змінних доступ до яких з інших модулів //можливий тільки при дотриманні деяких додаткових умов;
//тут же повинні бути реалізації всіх функцій, оголошених в заголовочному файлі
// а також можуть бути реалізації будь-яких додаткових функцій, не оголошених раніше
void __fastcall Tform1::Button1Click(TObject *Sender)
{
Close ();
}
Розглянемо докладніше ці файли. Заголовочний файл починається з автоматично включених в нього директив препроцесора. Зокрема, C++Builder сам поміщає тут директиви include, що підключають копії файлів, в яких описані ті компоненти, змінні, константи, функції, які ви використовуєте в даному модулі. Проте для деяких функцій таке автоматичне підключення не проводиться. У цих випадках розробник повинен додати відповідні директиви include вручну.
Після директив препроцесора розташовано опис класу форми. Ім'я класу форми — Tform1. Клас містить три розділи: __published — відкритий розділ, що містить оголошення розміщених на формі компонентів і обробників подій в них, private — закритий розділ класу, і public — відкритий розділ класу. В даному випадку в розділі published можна бачити оголошення покажчиків на два компоненти: компонент Button1 типу TButton і компонент Label1 типу TLabel. Там же розташовано оголошення функції Button1Click — створеного обробника події клацання на кнопці Button1. Все, що є в розділі__published, C++Builder включає в нього автоматично в процесі проектування форми. А в розділи private і public можна додавати свої оголошення типів, змінних, функцій. Те, що оголошено в розділі public, буде доступне для інших класів і модулів. Те, що оголошене в розділі private, доступно тільки в межах даного модуля. Єдине, що С++Builder самостійно включив в розділ public, це оголошення (прототип) конструктора форми Tform1.
Після оголошення класу слідує структура PACKAGE, яка включається у файл автоматично і яке ми зараз розглядати не будемо.
Файл реалізації модуля має наступну структуру. Після автоматично включених в цей файл директив препроцесора слідує теж автоматично включене оголошення покажчика на об'єкт форми Form1, а потім — виклик конструктора форми. Тіло відповідної функції порожнє, але ви можете включити в нього якісь оператори. Після цього розміщуються описи всіх функцій, оголошених в заголовочному файлі. Ви можете також розміщувати тут оголошення будь-яких типів, констант, змінних, не оголошених в заголовному файлі, і розміщувати описи будь-яких функцій, не згаданих в заголовному файлі.
Імена файлам модулів C++Builder дає за умовчанням: для першого модуля ім'я – Unit1, для другого - Unit2, і так далі
Контрольні питання:
1. Які основні типи файлів створює C++Builder в процесі проектування програми? Поясніть їх призначення.
2. Для чого призначені файли наступних типів .~cр, .~df, .~cp, .~h?
3. Що потрібно зробити для включення в .ехе файл спеціальних динамічних бібліотек?
4. Для чого використовують Депозитарій?
5. Які особливості збереження проекту у ІСР C++Builder?
6. Що зберігається у головному модулі проекту?
7. У якому файлі зберігається код обробників подій, які створюються в процесі розробки програми?