1. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
1
Лекция 11 (ч.3)
Синтаксис и программные конструкции Visual C
3. Проект приложения в C++Builder
Проект в визуальной среде проектирования С++Builder состоит из нескольких файлов и
необходим для корректного проектирования и компиляции приложения. В общем случае состав
проекта зависит от типа разрабатываемого приложения (графическое приложение, консольное
приложение, динамическая библиотека, системная служба, WEB приложение). Рассмотрим
состав проекта для графического (WIN32 GUI) приложения, поскольку именно с таким чаще
всего приходится сталкиваться прикладным программистам. Все файлы, входящие в проект,
можно разделить на две группы: файлы проекта и файлы форм. По умолчанию файлы проекта
имеют имя project1, а файлы форм unit1, unit2 и т.д. К файлам проекта относятся следующие
типы файлов: главный файл проекта, исходный файл проекта, файл ресурсов проекта. Главный
файл проекта имеет расширение *.bpr и необходим при разработке любых приложений в среде
С++Builder. Данный файл содержит опции, предназначенные для компилятора и линковщика, и
необходим для создания выходного модуля приложения. Этот файл является аналогом файла
makefile, используемого во многих системах программирования, базирующихся на С++. Для
получения файла *.mak из главного файла проекта можно использовать пункт главного меню
Project | Export Makefile. Сам главный файл проекта представлен в формате XML и состоит из
нескольких секций: MACROS, OPTIONS, LINKER, FILELIST, IDEOPTIONS, содержание
которых определяет состав проекта, опции сборки проекта в результирующий модуль,
используемые библиотеки и пакеты и т.п. Фрагмент главного файла проекта приведен в листинге
3.1. Для просмотра файла можно использовать пункт главного меню среды разработки
Project|Edit Option Source. Однако ручное редактирование данного файла не рекомендуется, и все
изменения в данный файл вносятся автоматически при изменении опций проекта (пункт меню
Project|Options или комбинация клавиш Shift-Ctrl-F11), а также при добавлении и удалении
файлов в проект. Для добавления файлов в проект можно использовать пункт главного меню
Project|Add to Project (комбинация клавиш Shift-F11). Для удаления файлов из проекта можно
использовать пункт главного меню Project|Remove from Project.
3. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
3
<FILELIST>
<FILE FILENAME="Project1.res" FORMNAME=""
UNITNAME="Project1.res" CONTAINERID="ResTool" DESIGNCLASS=""
LOCALCOMMAND=""/>
<FILE FILENAME="Project1.cpp" FORMNAME=""
UNITNAME="Project1" CONTAINERID="CCompiler" DESIGNCLASS=""
LOCALCOMMAND=""/>
<FILE FILENAME="C:Program FilesBorlandCBuilder6BinUnit1.cpp"
FORMNAME="Form1" UNITNAME="Unit1" CONTAINERID="CCompiler" DESIGNCLASS=""
LOCALCOMMAND=""/>
</FILELIST>
. . .
</PROJECT>
Исходный файл проекта имеет расширение *.cpp и для графического приложения
содержит функцию WinMain, которая является точкой входа при запуске приложения. Для
просмотра исходного файла проекта можно использовать пункт главного меню среды разработки
Project|View Source. В данном файле содержится код для начальной инициализации различных
подсистем приложения, код для создания автоматически создаваемых форм приложения,
обработка исключительных ситуаций, а также код для организации цикла обработки сообщений.
Поскольку выполнение приложения начинается именно с функции WinMain, то в данный файл
целесообразно добавить код, который необходимо выполнить еще до отображения главной
формы приложения. Например, обработка ключей запуска приложения, запрещение запуска
второй копии приложения, отображения окна splash screen во время загрузки приложения.
Пример исходного файла проекта приведен в листинге 3.2.
Листинг 3.2. Файл проекта (project1.cpp)
#include <vcl.h>
4. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
4
#pragma hdrstop
USEFORM("С:Program FilesBorlandCBuilder6BinUnit1.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;}
Двоичный файл ресурсов проекта имеет расширение *.res и содержит ресурсы
приложения. По умолчанию в данном файле находится один ресурс типа ICON с именем
MAINICON, содержащий пиктограмму главного окна приложения. Также в данный файл может
быть включена информация о версии приложения. В общем случае файл ресурсов может
содержать различные типы ресурсов, например, BITMAP, CURSOR, DIALOG, MENU,
STRINGTABLE и др. Данный файл создается автоматически при компиляции приложения и его
ручное редактирование недопустимо. При необходимости включения в проект каких-либо
дополнительных ресурсов необходимо добавить в проект с помощью пункта меню Project| Add to
project дополнительный исходный файл ресурсов с расширением *.rc или откомпилированный
5. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
5
файл ресурсов с расширением *.res. Например, добавить в файл ресурсов myres.rc пиктограмму
из файла “earth.ico” можно следующим образом:
MYICON ICON "EARTH.ICO"
После сборки приложения данная пиктограмма будет храниться в готовом модуле (exe
или dll). В коде приложения доступ к ней можно получить следующим образом:
Application->Icon->Handle=LoadIcon(HInstance,"MYICON");
Глобальная переменная HInstance в приложениях C++Builder содержит дескриптор
текущего экземпляра приложения. В общем случае данный дескриптор передается системой в
качестве первого параметра функции WinMain.
Для добавления форм в проект можно использовать пункт главного меню File|New|Form.
Каждая форма приложения содержит следующие типы файлов: файл формы, файл модуля
формы, заголовочный файл формы. Файл формы имеет расширение *.dfm и содержит
информацию о компонентах, помещенных на форму. Начиная с 5-ой версии С++Builder, файл
формы имеет текстовый вид, в ранних версиях использовался двоичный файл формы. Для
совместимости с предыдущими версиями можно вернуться к двоичному файлу, отключив опцию
Text DFM в контекстном меню редактора форм. Файл формы используется редактором форм,
изменения в него вносятся автоматически при проектировании приложения и его ручное
редактирование не рекомендуется. Для просмотра файла формы можно использовать пункт
контекстного меню View as Text редактора форм. Для возврата в режим редактора формы можно
использовать пункт контекстного меню View as Form. Фрагмент файла формы приведен в
листинге 3.3.
Листинг 3.3. Файл формы
object Form1: TForm1
Left = 192
Top = 107
BorderStyle = bsDialog
Caption = 'Test'
6. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
6
object Image1: TImage
Left = 40
Top = 64
Width = 105
Height = 81
end
object Button1: TButton
Left = 24
Top = 24
Width = 75
Height = 25
Caption = 'Close'
TabOrder = 0
end
end
Из листинга видно, что файл формы хранит значения свойств и событий компонент
формы, присвоенных им в инспекторе объектов. Это необходимо для восстановления данных
значений при последующих загрузках проекта.
Исходный файл формы имеет расширение *.cpp и содержит реализацию всех методов
класса формы и обработчиков событий. Данный файл также называется модулем формы или
form unit.
Листинг 3.4. Модуль формы
#include <vcl.h>
7. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
7
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{}
void __fastcall TForm1::FormCreate(TObject *Sender)
{ date d;
getdate(&d);
Form1->Caption="Сегодня"+IntToStr(d.da_day)+"."+
IntToStr(d.da_mon)+"."+IntToStr(d.da_year);}
В листинге 3.4 приведен фрагмент возможного содержимого файла модуля формы. В
данном примере файл содержит конструктор формы TForm1 и обработчик события создания
формы FormCreate. При генерации в инспекторе объектов новых обработчиков их определение с
пустым телом автоматически добавляется в файл модуля формы, а задача программиста – в
наполнении тела обработчика кодом.
Заголовочный файл формы имеет расширение *.h и содержит описание класса формы
(листинг 3.5). Заголовочный файл подключается к исходному файлу формы с помощью
директивы препроцессора #include. Для предотвращения повторного определения класса код
заголовочного файла обрамлен директивами препроцессора
#ifndef Unit1H
#define Unit1H
8. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
8
// код
#endif
По умолчанию в редакторе кода отображается исходный файл формы. Для переключения
между исходным файлом формы и заголовочным файлом можно использовать пункт
контекстного меню редактора кода Open Source/Header File (комбинация клавиш Ctrl-F6).
Необходимо также отметить, что в заголовочном файле также находится внешнее определение
указателя на класс формы.
extern PACKAGE TForm1 *Form1;
Поэтому для использования данной формы из других форм приложения в исходных
файлах этих форм необходимо просто подключить заголовочный файл формы с помощью
директивы препроцессора #include. Аналогичные действия производятся автоматически при
выборе пункта главного меню File| Include Unit Hdr (комбинация клавиш Alt-F11). Ниже
приведен пример исходного файла проекта.
Листинг 3.5. Заголовочный файл формы
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
class TForm1 : public TForm
{__published: // IDE-managed Components
TButton *Button1;
9. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
9
TImage *Image1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);};
extern PACKAGE TForm1 *Form1;
#endif
Содержимое заголовочного файла может формироваться как автоматически при работе
программиста с редактором форм и инспектором объектов, так и самим программистом с
клавиатуры. В приведенном примере видно, что на форму были добавлены компоненты TButton
и TImage, а в инспекторе объектов был создан обработчик события FormCreate.
Для сохранения файлов проекта можно использовать пункт главного меню File | Save
Project As. Для сохранения файлов формы можно использовать пункт главного меню File | Save
As. При этом можно задать новые имена для файлов проекта и файлов форм. Для сохранения
изменений во всех файлах можно использовать пункт главного меню File | Save All (комбинация
клавиш Shift-Ctrl-S). Для закрытия проекта можно использовать пункт меню File | Close All. Для
открытия проекта можно использовать пункт меню File | Open Project (комбинация клавиш Ctrl-
F11).
При одновременной разработке нескольких связанных приложений (например, при
разработке клиент/серверных систем) можно использовать группу проектов. Для добавления
новых и существующих проектов в группу можно использовать пункты главного меню Project |
Add New Project и Project | Add Existing Project соответственно. Выбор текущего проекта можно
произвести в менеджере проектов, доступного через пункт главного меню View | Project Manager
(комбинация клавиш Ctrl-Alt-F11). Файл группы проектов имеет расширение *.bpg и содержит
информацию о проектах, входящих в группу.
В процессе компиляции создаются некоторые временные файлы. Файлы, расширение
которых начинается с символа “~”, являются резервными копиями соответствующих файлов.
10. Лекция №11 для дисциплин: «Прикладное программирование» и «Языки
программирования»
10
Файлы с расширением *.obj объектные файлы приложения и форм. Файл с расширением *.tds
содержит информацию для отладчика и инкрементного линковщика.
Кроме того существуют несколько дополнительных типов файлов, используемых,
например, при создании пакетов и библиотек типов. Рассмотрение данных типов файлов
выходит за рамки данного учебного пособия.
Вывод
Проект приложения в среде C++Builder состоит из нескольких файлов, основными из
которых являются: главный файл проекта (с расширением .bpr), исходный файл проекта (по
умолчанию называется project1.cpp), а также для каждой формы приложения файл формы
(расширение .dfm), заголовочный файл (расширение .h) и модуль формы (расширение .cpp).
Помимо этого в состав проекта могут входить файлы ресурсов, внешние библиотеки, пакеты.
При работе с проектом система создает также некоторые дополнительные файлы, необходимые
для сборки приложения.