//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TOneForm: public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TOneForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TOneForm *OneForm;
//---------------------------------------------------------------------------
#endif
Дадим необходимые комментарии к тексту заголовочного файла. Первые две строки и последняя строка файла содержат директивы условной компиляции:
#ifndef Unit1H
#define Unit1H
…
#endif
Здесь они нужны для того, чтобы исключить повторную компиляцию заголовочного файла при его повторном включении в один и тот же программный файл. Это случается в сложных проектах, когда программные модули используют друг друга.
Директива #ifndef (от английского if not defined — если не объявлен) проверяет, не была ли объявлена константа UnitlH. Если такое объявление уже было, компилятор пропускает текст до строки с директивой #endif. В противном случае объявляется константа Unit1H и компилируется весь заголовочный файл.
|
|
Перейдем к следующим строкам заголовочного файла Unit1.h. Они содержат директивы включения необходимых заголовочных файлов библиотеки VCL:
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
Встретив директиву #include, компилятор просто подставляет содержимое заданного файла вместо нее и продолжает трансляцию модуля (т. е. фактически осуществляется компиляция всех записанных заголовочных файлов). Среда C++Builder формирует эти строки без вашего участия (в зависимости от используемых компонентов), но, в принципе, список подключенных файлов можно изменять и вручную.
Далее в заголовочном файле объявлен класс формы. По умолчанию он называется Tform1 и порожден от стандартного класса TForm. Помещенные на форму компоненты представлены полями формы. У нас на форме шесть компонентов, поэтому и полей в описании класса тоже шесть. Имена полей совпадают с именами компонентов, заданными в инспекторе объектов.
После полей идут заголовки методов обработки событий. Название каждого такого метода среда C++Builder формирует автоматически на основании имени компонента и имени генерируемого им события. Например, для кнопки Button1 метод обработки события OnClick называется ButtonlClick.
Обратите внимание, что поля, представляющие компоненты формы, и методы обработки событий получают атрибут видимости __ published (он принимается по умолчанию для всех наследников TForm). Благодаря этому вы можете работать с ними на визуальном уровне, например видеть их имена в инспекторе объектов. Поскольку среда C++Builder умеет понимать содержимое секции __published на этапе проектирования, никогда не модифицируйте эту секцию вручную, пользуйтесь визуальными инструментами: палитрой компонентов и инспектором объектов. Запомните:
|
|
· Когда вы помещаете на форму компоненты, среда C++Builder добавляет в описание класса соответствующие поля, а когда вы удаляете компоненты с формы, среда C++Builder удаляет их поля из описания класса.
· Когда вы определяете в форме или компонентах обработчики событий, среда C++Builder определяет в классе соответствующие методы, а когда вы удаляете весь код из методов обработки событий, среда C++Builder удаляет и сами методы.
Для вашего удобства в классе формы заранее объявлены пустые секции private и public, в которых вы можете размещать любые вспомогательные поля, методы и свойства. Визуальная среда C++Builder их "не видит", поэтому с ними можно работать только на уровне исходного текста в редакторе кода.
Вы наверняка обратили внимание на ключевое слово __ fastcall в заголовках методов. Оно указывает, что при вызове данного метода параметры передаются через внутренние регистры процессора, а не как обычно — через стековую память. Это увеличивает быстродействие программы, поэтому все стандартные функции из библиотеки VCL объявлены таким образом.
После описания класса объявлена ссылка на объект данного класса, это необходимо для того, чтобы использовать объект класса в других программных модулях.
extern PACKAGE TOneForm *OneForm;
Н-файл определяет интерфейс программного модуля. Реализация интерфейса выполняется в СРР-файле: