double arrow

Структура файлов модулей форм


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" и т.д.







Сейчас читают про: