Try
СТРУКТУРА ГЛАВНОГО ФАЙЛА ПРОЕКТА
В процессе проектирования вами приложения C++Builder автоматически создает коды головного файла проекта, коды отдельных модулей и коды их заголовочных файлов.
Головной файл содержит функцию WinMain (main – для консольного ). Обычно мы его не видим и не трогаем. Для просмотра: меню Project| ViewSource
// директивы препроцессора
#include <vcl.h>
#pragma hdrstop
// макросы, подключающие файлы ресурсов и форм
USERES ("Projectl. res");
USEFORM("Unitl.cpp", Forml);
USEFORM("Unit2.cpp", Form2);
/ / __________________________________________________________
// функция main
WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
{ Application->Initialize ();
Application->CreateForm(_ classid (TForm1), &Forml)
Application->CreateForm(classid(TForm2), &Form2);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
Начинается файл головного модуля строками, первый символ которых — "#". С этого символа начинаются директивы препроцессора. Среди них наиболее важны для вас директивы #include. Эти директивы подключают в данный файл тексты указанных в них файлов. В частности, подобными директивами включаются в текст заголовочные файлы. Например, директива #include <vcl.h> подключает заголовочный файл vcl.h, содержащий объявления, используемые в библиотеке визуальных компонентов C++Builder.
|
|
После директив препроцессора в файле размещены предложения USERES и USEFORM. Это макросы, используемые для подключения к проекту файлов форм, ресурсов и др. Препроцессор развернет эти макросы в соответствующий код. В данном случае вы можете видеть два макроса USEFORM, подключающих формы. C+4-Builder автоматически формирует соответствующее предложение с макросом USEFORM для каждой формы, вносимой вами в проект. Первый параметр макроса содержит имя файла модуля, соответствующего форме (например, "Unitl.cpp"), а второй параметр — имя формы.
После всех этих вспомогательных предложений в файле расположена главная функция программы - - WinMain. Ее первым параметром является дескриптор данного экземпляра приложения. Дескриптор — это некий уникальный указатель, позволяющий Windows разбираться в множестве одновременно открытых окон различных приложений. Иногда вы будете использовать дескрипторы при обращении к различным функциям API Windows (API Windows — это пользовательский интерфейс Windows, содержащий множество полезных функций). Второй параметр WinMain - - дескриптор предыдущего экземпляра вашего приложения(если пользователь выполняет одновременно несколько таких приложений). Третий параметр является указателем на строку с нулевым символом в конце, содержащую параметры, передаваемые в программу через командную строку. Иногдатакие параметры используются для переключения режимов работы программы или для задания различных опций при запуске приложения из диспетчера программ или функцией WinExec.
|
|
Последний параметр определяет окно приложения. Этот параметр может в дальнейшем передаваться в функцию ShowWindow.
В головной функции main, используемой в консольных приложениях тоже имеются параметры, дающие доступ к элементам командной строки. Впрочем, эти параметры и в WinMain, и в main используются достаточно редко.
После заголовка функции WinMain следует ее тело, заключенное в фигурные скобки.
Первый выполняемый оператор тела функции — Application—>Initialize инициализирует объекты компонентов данного приложения.
Последующие операторы Application—>CreateForm создают объекты соответствующих форм. Формы создаются в той последовательности, в которой следуют эти операторы. Первая из создаваемых форм является главной.
Последний оператор — Application—>Run начинает собственно выполнение программы. После этого оператора программа ждет соответствующих событий, которые и управляют ее ходом.
Перечисленные операторы тела функции WinMain заключены в блок try, после которого следует блок catch. Это структура, связанная с обработкой так называемых исключений — аварийных ситуаций, возникающих при работе программы. Если такая аварийная ситуация возникнет, то будут выполнены операторы, расположенные в блоке catch. По умолчанию в этом блоке расположен стандартный обработчик исключений с помощью функции Application—>ShowException.
Все описанные выше операторы головного файла приложения заносятся в него автоматически в процессе проектирования вами приложения. Например, при добавлении в проект новой формы в файл автоматически вставляются соответствующее предложение USEFORM и оператор Application—>CreateForm, создающий форму. Так что обычно ничего в головном файле изменять не надо и даже нет необходимости его смотреть.
Только учтите, что все определенные вами в головном файле проекта глобальные константы и переменные будут доступны в другом блоке только в случае, если они объявлены там со спецификацией extern. Функции, определенные вами в головном файле проекта, будут доступны в другом блоке только в случае, если там повторен их прототип.
Имя головного файла проекта по умолчанию дается стандартное: Projectl, Project2 и т.п. Это же имя будет и у выполняемого модуля вашей программы. Так что желательно изменить имя по умолчанию. Для этого достаточно сохранить головной файл проекта под соответствующим именем.
Каждый такой модуль состоит из двух файлов: заголовочного, содержащего описание класса формы, и файла реализации.
Ниже приведены тексты этих файлов модуля формы, на которой размещена одна метка (компонент типа TLabel) и одна кнопка (компонент типа TButton). Подробные комментарии в этом тексте поясняют, куда и что в этот код вы можете добавлять.
Заголовочный файл:
//
#fifndef UnitlH
#define UnitlH
//
#include «Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
// сюда могут помещаться дополнительные директивы
// препроцессора (в частности, include),
// не включаемые в файл автоматически
//
// объявление класса формы TForml
class TForml: public TForm
{
published: // IDE-managed Components
// размещенные на форме компоненты
TButton *Buttonl;
TLabel *Labell;
void fastcall ButtonlClick(TObject *Sender);
private: // User declarations
// закрытый раздел класса
// сюда могут помещаться объявления типов, переменных, функций,
// включаемых в класс формы, но не доступных для других модулей
public: // User declarations
// открытый раздел класса
// сюда могут помещаться объявления типов, переменных, функций,
// включаемых в класс формы и доступных для других модулей
fastcall TForml(TComponent* Owner);
};
//
extern PACKAGE TForml *Forml;
//,
// сюда могут помещаться объявления типов, переменных, функций,
// которые не включаются в класс формы;
// доступ к ним из других блоков возможен только при соблюдении
|
|
// некоторых дополнительных условий
#endif
Файл реализации:
/ /
finclude <vcl.h>
#pragma hdrstop
#include "Unitl.h"
//
tpragma package(smart_init)
tpragma resource "*.d£m"
// сюда могут помещаться дополнительные директивы
// препроцессора (в частности, include),
// не включаемые в файл автоматически
// объявление объекта формы Forml
TForml *Forml;
//
// вызов конструктора формы Forml
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
^, {
// сюда вы можете поместить операторы,
// которые должны выполняться при создании формы
}
//
// сюда могут помещаться объявления типов и переменных,
// доступ к которым из других модулей возможен только при
// соблюдении некоторых дополнительных условий;
// тут же должны быть реализации всех функций, объявленных в
// заголовочном файле, а также могут быть реализации любых
// дополнительных функций, не объявленных ранее
void fastcall TForml::ButtonlClick(TObject *Sender)
(
Close ();
}
Рассмотрим подробнее эти файлы. Заголовочный файл начинается с автоматически включенных в него директив препроцессора. В частности, C++Builder сампомещает тут директивы include (см. разд. 1.4), подключающие копии файлов, в которых описаны те компоненты, переменные, константы, функции, которые вы используете в данном модуле. Однако для некоторых функций такое автоматическое подключение не производится. В этих случаях разработчик должен добавить соответствующие директивы include вручную.
После директив препроцессора следует описание класса формы. Имя класса вашей формы — TForml. Класс содержит три раздела: published — открытый раздел, содержащий объявления размещенных на форме компонентов и обработчиков событий в них, private — закрытый раздел класса, и public — открытый раздел класса. В данном случае в разделе published вы можете видеть объявления указателей на два компонента: компонент Buttonl типа TButton и компонент Labell типа TLabel. Там же вы видите объявление функции ButtonlClick — введенного пользователем обработчика события щелчка на кнопке Buttonl. Все, что имеется в разделе published, C++Builder включает в него автоматически в процессе проектирования вами формы. Так что вам не приходится, как правило, работать с этим разделом. А в разделы private и public вы можете добавлять свои объявления типов, переменных, функций. То, что вы или C++Builder объявите в разделе public, будет доступно для других классов и модулей. То, что объявлено в разделе private, доступно только в пределах данного модуля. Как вы можете видеть, единственное, что C++Builder самостоятельно включил в раздел public, это объявление (прототип) конструктора вашей формы TForml.
|
|
После объявления класса следует предложение PACKAGE, которое включается в файл автоматически и которое мы сейчас рассматривать не будем.
После этого вы можете разместить объявления типов, переменных, функций, к которым при соблюдении некоторых дополнительных условий (см. разд. 1.8) будет доступ из других модулей, но которые не включаются в класс формы.
Теперь рассмотрим текст файла реализации модуля. После автоматически включенных в этот файл директив препроцессора следует тоже автоматически включенное объявление указателя на объект формы Forml, а затем — вызов конструктора формы. Тело соответствующей функции пустое, но вы можете включить в него какие-то операторы. Эти операторы будут выполняться при создании формы. В них можно включить какие-то начальные настройки свойств этой формы.
После конструктора размещаются описания всех функций, объявленных в заголовочном файле. Вы можете также размещать здесь объявления любых типов, констант, переменных, не объявленных в заголовочном файле, и размещать описания любых функций, не упомянутых в заголовочном файле.
Имена файлам модулей C++Builder дает по умолчанию: для первого модуля имя равно "Unitl", для второго — "Unit2" и т.д.