- Глава 14. Структура файлов
Глава 14. Структура файлов
В этой главе описывается структура файлов проекта. На первый взгляд этот материал может показаться очень трудным. Но со временем описанные директивы станут привычными.
Теперь рассмотрим более подробно структуру основных файлов программы, для того чтобы не теряться при возникновении сложных ошибок и иметь представление о том, как работает программа. Вернемся к нашему примеру и рассмотрим состав файлов проекта. Для лучшего понимания текста программ тем, кто не знаком с языками программирования, я рекомендую познакомиться с основами языка программирования C++, например, по книге1. В языке программирования C++ главной функцией проекта является функция main. В программах, написанных для операционной системы Windows, главной функцией является winMain. Данная функция содержится в программном модуле butct.cpp нашего примера. В листинге 14.1 приведено его содержимое.
Листинг 14.1. Программный модуль butct.cpp
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("..\p1\Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
В этих нескольких строках содержатся директивы и команды, с помощью которых формируется программа. Строки, начинающиеся с символов //, являются строками комментариев для разделения или снабжения текстовым описанием частей программы. В языке Си допускается также заключать комментарии между символами /* и */. Строка #inciude <vci.h> является строкой препроцессора, то есть программы, которая будет подключать к нашим модулям дополнительные файлы библиотек и описаний. В данном случае, строка #inciude <vci.h> сообщает препроцессору о том, что ему необходимо подключить к нашей программе заголовочный файл vcl.h, в котором содержатся описания визуальных компонентов Borland C++ Builder 6. Директива #pragma hdrstop завершает список файлов заголовка для препроцессора. Строка макрокоманды USEFORM("..\p1\Unit1.cpp", Form1); подключает к проекту модуль Ubutct.cpp и форму Form1. Далее следует заголовок программы главной функции Проекта WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) Перед названием главной функции находится дескриптор winapi, который позволяет использовать множество готовых, полезных функций Windows в нашем приложении. В скобках заключены параметры главной функции, необходимые для опознания нашего приложения среди множества других работающих приложений, для передачи параметров в программу в командной строке и для определения конфигурации окна нашего приложения. После заголовка главной функции следует блок кода, в котором может произойти сбой программы — аварийная ситуация (останов, ошибка программы и пр.). Такой блок должен начинаться с ключевого слова try. В этом блоке заключены операторы инициализации компонентов приложения Application->Initialize();,
Создания формы приложения Application->CreateForm(__classid(TForml) , SForml) ;
И выполнения приложения Application->Run();.
Блок catch (Exception &exception) предназначен для включения операторов, вызываемых при возникновении аварийной ситуации. В нашем примере программы таким оператором является стандартный обработчик исключений Application->ShowException(&exception);. В следующих примерах МЫ рассмотрим, как его использовать. Аналогичная конструкция блоков повторяется для копии приложения, запушенного вторично. Последним оператором тела функции winMain является return 0; — оператор, завершающий приложение с кодом 0.
Данный файл можно редактировать, изучив предварительно команды и функции Windows и получив некоторый опыт разработки программ. Поскольку этот файл создается средой разработки автоматически, мы в нашем курсе обучения не будем его изменять намеренно, чтобы не отягощать себя лишними проблемами. Тем не менее, при возникновении ошибок компилятора или компоновщика, не лишним будет посмотреть содержимое данного файла и отредактировать его в случае необходимости. Например, при создании новой формы и последующем ее удалении в этом файле могут сохраниться записи о несуществующей форме, приводящие к ошибкам во время трансляции. Для устранения подобных ошибок необходимо удалить лишние записи из этого файла.
Рассмотрим структуру файла butct.cpp. Содержимое этого файла целиком приведено в листинге 14.2.
Листинг 14.2. Содержимое файла butct.cpp
#include <vcl.h>
#pragma hdrstop
#include "Ubutct.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption="Kнonкa 1 нажата " + IntToStr(++i) +" раз";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close ();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
i=0;
}
//---------------------------------------------------------------------------
Большинство строк этого файла нам уже известно из предыдущего описания и самого примера программы. Рассмотрим лишь неизвестные строки.
Строка #pragma package (smart_init) определяет последовательность инициализации составных частей программы. Строка #pragma resource "*.dfm" сообщает препроцессору о том, что для формы необходимо использовать файл *.dfm с именем данного файла. В строке TForm1 *Form1; объявляется класс TForm1 для формы Form1. Далее следуют подпрограммы создания формы приложения и обработчики событий, рассмотренные ранее.
Обратите внимание на строку #inciude "ubutct.h", которая подключает к модулю заголовочный файл Ubutct.h, представленный в листинге 14.3.
Листинг 14.3. Заголовочный файл Ubutct.h
#ifndef UbutchH
#define UbutchH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TLabel *Label1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
int i; // Переменная - счетчик
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Ранее мы уже редактировали его в примере, вставляя строку инициализации переменной i. Рассмотрим этот файл детальнее. Строка tifndef UbutctH является директивой условной компиляции. Эта директива проверяет, не был ли ранее определен идентификатор UbutctH директивой idefine. Если не был, то предваряемый директивой фрагмент кода компилируется. В противном случае компиляция фрагмента не производится. Затем строка #define UbutctH определяет идентификатор UbutctH. Далее следуют четыре строки #include включения файлов, где описаны компоненты, переменные, константы и функции, которые будут использованы в данном модуле. Сюда можно добавлять дополнительные директивы, не создаваемые средой разработки автоматически. После этих строк следует описание класса формы с тремя разделами:
□ __published: — содержит объявления размещенных на форме компонентов и обработчиков событий, которые среда разработки записывает в файл автоматически в процессе проектирования формы;
□ private: — предназначен для объявления закрытых переменных, то есть доступных только для данного модуля;
□ public: — предназначен для объявления открытых переменных, то есть доступных не только для данного модуля, но и для других классов и модулей. Именно в этот раздел мы включили (записали) переменную — счетчик i.
Строка extern PACKAGE TForml *Form1; объявляет класс TForm1 как доступный из других модулей. И завершает файл строка #endif окончания условной директивы #ifndef.
Следующие два файла butct.bpr и Ubutct.dfm представляют собой текстовые файлы установок проекта и формы данного проекта соответственно. Они создаются и редактируются автоматически в процессе разработки и изменения проекта в среде разработки. Файл butct.bpr содержит директивы и макрокоманды настроек среды разработки и его не следует корректировать вручную для избежания внесения ошибок, хотя просмотреть содержимое можно с помощью любого текстового редактора. Файл Ubutct.dfm представляет собой текстовые записи содержания и свойств формы. Его можно просмотреть и даже отредактировать в самой среде разработки. Для этого необходимо щелкнуть левой кнопкой мыши на форме для ее выделения, а затем щелчком правой кнопки открыть контекстное меню (рис. 14.1) и выбрать в нем команду View as Text.
Рис. 14.1. Контекстное меню
Перед вами должно открыться окно (рис. 14.2), в котором представлено содержимое файла формы в текстовом виде.
Рис. 14.2. Окно формы
Здесь можно просмотреть и отредактировать при необходимости любую запись.
Например, В строках Left = 192, Тор = 114, Width = 277 и Height = 134 можно изменить левый и верхний отступ, а также ширину и высоту формы соответственно. В строчках Caption = 'Программа 1' и Color = clBtnFace можно изменить, соответственно, заголовок формы и цвет ее фона. Вернуться к исходному виду формы можно с помощью комбинации клавиш <Alt>+<F12> или через контекстное меню по команде View as Form.
Файлы butct.res и ubutct.ddp являются двоичными файлами, хранящими ресурсы и диаграммы проекта соответственно, и не подлежат ручному редактированию. Исполняемый файл проекта имеет имя butct.exe. Наконец, файл с расширениями tds является отладочным файлом проекта, который можно всегда создать в среде разработки повторно, имея исходные файлы проекта. Помимо описанных файлов среда разработки позволяет создавать дополнительные файлы, которые являются вспомогательными и не подлежат ручной корректировке.