Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++Builder. Учебный курс

.pdf
Скачиваний:
14
Добавлен:
15.11.2022
Размер:
9.54 Mб
Скачать

ботки поступающих от Windows сообщении о действиях пользова­ теля. После этого оператора программа ждет соответствующих событий, которые и управляют ее ходом. Когда пользователь щелкнет по кнопке C lo s e , Windows передаст приложению специ­ альное сообщение, которое заставит приложение прекратить рабо­ ту и освободить назначенные ей системные ресурсы (память и процессор).

Перечисленные операторы тела функции W inM ain заключе­ ны в блок t r y , после которого следует блок c a tc h . Это структу­ ра, связанная с обработкой так называемых исключений (аварий­ ных ситуаций), возникающих при работе программы. Если такая аварийная ситуация возникнет, то будут выполнены операторы, расположенные в блоке c a tc h . По умолчанию в этом блоке рас­ положен стандартный обработчик исключений с помощью метода

А ррl i c a t i o n - > S how E xcept io n .

Последним оператором тела функции W inM ain является опе­ ратор r e t u r n 0, завершающий приложение с кодом завершения 0.

Все описанные выше операторы головного файла приложения заносятся в него автоматически в процессе проектирования при­ ложения. Например, при добавлении в проект новой формы в файл автоматически вставляются соответствующее предложение

USEFORM и оператор A p p lic a tio n - > C r e a te F o rm , создающий форму. Так что обычно ничего в головном файле изменять не надо, и даже нет необходимости его смотреть. Именно по этой причине файл проекта обычно не показывается в окне кода.

Таким образом, файл проекта полностью формируется самой C++Builder и обычно не предназначен для редактирования.

-Выполните команду Fi 1е - >New Form 2-3 раза.

-Посмотрите, как изменился файл головного проекта.

1.2.2. Файл модуля

Модули - это программные единицы, предназначенные для размещения фрагментов программ. С помощью содержащегося в

них программного кода реализуется вся поведенческая сторона программы. Каждый такой модуль состоит из двух файлов:

-заголовочного, содержащего описание класса формы;

-файла реализации.

1.2.2.1. Заголовочный файл

 

Ниже приведен текст заголовочного файла ( U n i tl .h )

моду­

ля формы, на которой размещена одна метка (компонент

типа

T L a b e l) и одна кнопка (компонент типа T B u tto n ) и объявлен

обработчик события O n C lic k компонента B u t t o n l . Подробные комментарии в этом тексте поясняют, куда и что в этот код вы мо­ жете добавлять.

/

/ ---------------------------------------------------------------------------------------------------------------

 

# i f n d e f

U n itlH

# d e f i n e

U n itlH

/

/ ---------------------------------------------------------------------------------------------------------------

 

#i n c l u d e c C l a s s e s . hpp>

#i n c l u d e c C o n t r o l s . hpp>

#i n c l u d e < S t d C t r l s . hpp>

#i n c l u d e <F o rm s . h p p >

#i n c l u d e <M enus. hpp>

/ /

сюда м огут

помещ аться дополнительны е директивы

/ / п р е п р о ц е с с о р а (в ч а с т н о с т и , i n c l u d e ) ,

/ /

не включаемые

в файл ав то м а ти ч ес к и

/ /

---------------------------------------------------------------------------------------------------------------

 

 

 

 

 

/ /

оп р ед ел ен и е

к л а с с а

формы

TForml

class TForml

 

public

TForm

 

{

 

 

 

 

 

 

__published: / /

ID E -m anaged

C om ponents

/ /

размещенные

на форме компоненты

 

T L ab el * L a b e l l;

 

 

 

T B u tto n

*B u t t o n l ;

 

 

void __fastcall

B u t t o n l C l i c k ( T O b j e c t *S e n d e r ) ;

private: / /

U s e r

d e c l a r a t i o n s

/ /

закрытый

р а з д е л к л а с с а

 

/ /

сюда м огут

помещ аться об ъ явлен и я типов,

/ /

переменных, функций, в ключа емых

в кя&сс

формы,

/ /

но не доступных для других модулей

 

public: // User declarations

 

 

 

/ /

открытый

р а з д е л

к л а с с а

 

 

 

/ /

сюда

м огут

помещ аться

объявления

типов,

 

/ /

переменных,

функций,

включаемых

в кл ас с

формы,

/ /

и доступных для других модулей

 

 

} ?

__ fastcall TForml(TComponent*

Owner);

 

 

 

 

 

 

 

 

 

/ /

----------------------------------------------------------------------------------------

PACKAGE

TForml *Forml;

 

 

 

extern

 

 

 

/ / ----------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

/ /

сюда

м огут

помещ аться

объявления

типов,

 

/ /

переменных,

функций,

которые

не

включаются

/ /

в к л а с с

формы;

 

 

 

 

 

/ /

д о сту п к

ним и з

других блоков

возможен только

/ /

при

соблюдении

некоторых дополнительных

условий

#endif

Весь это текст сформирован C++Builder, но в отличие от фай­ ла проекта, программист может его изменять, придавая программе нужную функциональность.

Заголовочный файл начинается с директивы условной компи­ ляции i f n d e f и директивы d e fin e . Это позволяет исключить зацикливание при циклических директивах in c lu d e , включаю­ щих в различных модулях заголовочные файлы друг друга. Когда в приложении первый раз включается файл U n i t l . h, то выпол­ няются указанные выше первые две директивы и идентификатор U n itlH оказывается определен. После этого компилируется текст файла, который находится между строками if n d e f и e n d if. Но если в результате директив in c lu d e этот же файл будет вклю­ чаться еще один раз, то обнаружится, что идентификатор UnitlH

уже определен, и повторной компиляции файла не произойдет.

Далее следуют автоматически включенные в файл директивы препроцессора. В частности, C++Builder сам помещает тут дирек­ тивы in c lu d e , подключающие копии файлов, в которых описаны те компоненты, переменные, константы, функции, которые вы ис­ пользуете в данном модуле. Однако, для некоторых функций такое автоматическое подключение не производится. В этих случаях разработчик должен добавить соответствующие директивы

in c lu d e вручную.

После директив препроцессора следует определение класса формы. Имя класса вашей формы - T F orm l. Класс T F orm l поро­ жден от класса TForm . Стандартный класс TForm реализует все нужное для создания и функционирования пустого Windows-окна. Термин "порожден" означает, что класс T F orm l унаследовал все возможности родительского класса TForm и добавил к нему соб­ ственные в виде дополнительных компонентов.

Классы служат основным инструментом реализации мощных возможностей C++Builder. Класс является образцом, по которому создаются объекты, и наоборот, объект - это экземпляр реализа­ ции класса.

Свойство наследования классами-потомками всех свойств ро­ дительского класса и обогащения их новыми возможностями явля­ ется одним из фундаментальных принципов объектноориентированного программирования (ООП). От наследника мо­ жет быть порожден новый наследник и т.д. В результате создается ветвящаяся иерархия классов, на вершине которой располагается самый простой класс TObj e c t (все классы в C++Builder порожде­ ны от этого единственного прародителя).

Класс T F o rm l содержит три раздела:

- _p u b lis h e d - открытый раздел, содержащий объявления размещенных на форме компонентов и обработчиков событий в них;

- p r i v a t e - закрытый раздел класса; - p u b li c - открытый раздел класса.

В данном случае в разделе__p u b lis h e d вы можете видеть объявления указателей на два компонента: компонент B u tto n l

типа T B u tto n и компонент L a b e ll типа T L ab el. Там же вы ви­ дите объявление метода B u t t o n lC l i c k - введенного пользова­ телем обработчика события щелчка на кнопке B u tto n l. Все, что имеется в разделе__ p u b l is h e d C++Builder, включает в него ав­ томатически в процессе проектирования вами формы. Так что вам не приходится, как правило, работать с этим разделом.

В разделы p r i v a t e и p u b l i c вы можете добавлять свои объявления типов, переменных, функций. То, что Вы или C++Builder объявите в разделе p u b l ic , будет доступно для дру­ гих классов и модулей. То, что объявлено в разделе p r i v a t e , до­ ступно только в методах данного класса. Как вы можете видеть, единственное, что C++Builder самостоятельно включил в раздел p u b l i c , это объявление (прототип) конструктора вашей формы

T F orm l.

После определения класса следует предложение PACKAGE, которое включается в файл автоматически, мы его сейчас рассмат­ ривать не будем. После этого можете разместить объявления ти­ пов, переменных, функций, к которым при соблюдении некоторых дополнительных условий будет доступ из других модулей, но ко­ торые не включаются в класс формы.

 

1.2.2.2.

Файл реализации

 

Ниже

приведен текст

файла реализации модуля

формы

( U n itl .c p p ) , в котором

определен обработчик

события

O n C lic k

компонента B u tto n l. Подробные комментарии в этом

тексте поясняют, куда и что в этот код вы можете добавлять.

/ / ----------------------------------------------------------------------------------------

 

 

 

# in c lu d e

< v cl.h >

 

 

#pragm a h d rs to p

# in c lu d e " U n itl . h"

/ / -------------------------------------------------------------------------------------------

#pragm a

p a c k a g e ( s m a r t _ i n i t )

 

 

 

 

 

#pragm a

r e s o u r c e

" * . dfm"

 

 

 

 

 

 

/ /

сюда

м огут

помещ аться

дополнительны е

директивы

/ / п р еп р о ц е с с о р а (в ч а с т н о с т и , i n c l u d e ) ,

 

/ /

не

включаемые

в файл

а в т о м а ти ч ес к и

 

 

 

/ /

об ъ явлен и е

о б ъ е к т а формы

TForml

 

 

 

 

TForm l

*F o rm l;

 

 

 

 

 

 

 

 

/ /

-------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

/ /

о п р ед ел ен и е

к о н с т р у к т о р а

формы TForml

 

__f a s t c a l l

T F o rm l: : TForm l(TC om ponent*

Owner)

 

 

TForm(Owner)

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

/ /

сюда

вы

можете

п ом естить

операторы ,

 

 

/ /

которы е

должны

вы п олн яться при созд ан и и

формы

}

 

 

 

 

 

 

 

 

 

 

 

 

/ / -------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

/ /

сюда

м огут

помещ аться

об ъ явлен и я

типов

и

/ /

переменных,

д о сту п к

которым и з

других

модулей

/ /

возможен то л ьк о при соблюдении некоторы х

/ /

дополнительны х

у сл о в и й ;

 

 

 

 

 

/ /

ту т

же

должны

быть р е а л и за ц и и в с е х

функций,

/ /

объявленных

в

заго л о в о ч н о м ф айле,

а

также м огут

/ /

быть

р е а л и за ц и и любых

дополнительны х

функций,

/ /

не

объявленных

р а н е е

 

 

 

 

 

 

v o id

__f a s t c a l l T F orm l: : B u tto n lC lic k (T O b je c t

* S en d er)

{

C lo s e ( ) ;

}

Директива #pragm a p a c k a g e ( s m a r t _ i n it ) определяет последовательность инициализации пакетов такой, какая устанав­ ливается взаимными ссылками использующих их модулей. Дирек­ тива #pragm a r e s o u r c e " * . dfm u говорит препроцессору, что

для формы надо использовать файл . d f m с тем же именем, что и имя данного файла. Во избежание всяких неприятностей лучше не трогать и не изменять эти директивы.

После автоматически включенных в этот файл директив пре­ процессора следует тоже автоматически включенное объявление указателя на объект формы F orm l, а затем - определение конст­ руктора формы. Тело соответствующей функции пустое, но вы можете включить в него какие-то операторы. После этого разме­ щаются определения всех методов, объявленных в заголовочном файле. Вы можете также размещать здесь объявления любых ти­ пов, констант, переменных, не объявленных в заголовочном фай­ ле, и размещать описания любых функций, не упомянутых в заго­ ловочном файле. Имена файлам модулей C++Builder дает по умол­ чанию: для первого модуля имя равно U n itl, для второго -

U n i t 2 и т.д.

Если в вашем приложении несколько модулей, сохраняйте их файлы под какими-то осмысленными именами, изменяя тем самым имена модулей, заданные C++Builder по умолчанию. Вам проще будет работать с осмысленными именами, а не с именами U n itl, U n i1 2, U n i t 3, которые ни о чем не говорят.

Таким образом, текст модуля доступен как C++Builder, так и программисту. C++Builder автоматически вставляет в заголовоч­ ный файл объявление любого добавленного к форме компонента, а также создает в файле модуля заготовки для обработчиков собы­ тий. Программист может добавлять свои методы в ранее объяв­ ленные классы, наполнять обработчики событий конкретным со­ держанием, вставлять собственные переменные, типы, константы и т.д.

1.3.

Управление проектами

1.3.1.

Создание нового проекта

Для создания нового проекта нужно выбрать команду меню:

File->New ->VCL Forms A p p l i c a t i o n - C + + B uilder.

1.3.2. Открытие существующего проекта

Для открытия существующего проекта нужно выполнить од­ ну из следующих команд:

- выбрать пункт меню F ile - > O p e n

P r o j e c t

£ 3

на панели инструмен­

-наж ать кнопку O pen P r o j e c t L^*

тов;

- нажать комбинацию клавиш C trl+ F 1 1 ;

-выбрать пункт меню F ile - > O p e n

и выбрать проект­

ный файл с расширением * . c b p r o j ;

 

- нажать кнопку O pen ^ на панели

инструментов и вы­

брать файл с расширением * . c b p ro j .

 

Примечания

1. Для открытия проекта, над которым вы недавно работали, удобнее выполнить команду F ile - > R e o p e n или воспользоваться стрелочкой рядом с соответствующей этой команде быстрой кноп­

ке ^ ж и выбрать из списка нужный проект. Будьте вниматель­ ны, список состоит из двух частей. В верхней части содержатся ссылки на файлы проектов, а в нижней - ссылки на файлы.

2. Для открытия форм и файлов модулей без включения их в

проект можно

использовать команду меню F ile - > O p e n

или кнопку ^

на панели инструментов.

1.3.3. Сохранение проекта

При работе в C++Builder обязательно соблюдайте следующие правила:

-перед первым запуском программы желательно сохранить проект;

-д л я каждого проекта отводите отдельную папку на диске. Создать новую папку можно непосредственно из диалогового окна сохранения проекта.

Примечание. В версии C++Builder 2007 компилятор создает файлы на диске в папке Мои документыХйАБ S tu - d i o \ P r o j e c t s .

Для сохранения приложения нужно выполнить одну из сле­ дующих команд:

- выбрать пункт меню F i 1 е - >S ave

A ll;

- нажать кнопку Ш . на панели инструментов;

-вы брать пункт меню F ile - > S a v e

P r o j e c t As

Эту команду можно использовать только при первом сохранении проекта. В дальнейшем ее можно использовать только для пере­ именования проектных файлов.

При первом сохранении C++Builder спросит у вас имя файла сохраняемого модуля, а затем имя файла проекта. Надо иметь в виду, что C++Builder не допускает одинаковых имен модулей и проектов, поскольку файл реализации модуля и головной файл проекта имеют одинаковое расширение . срр.

Сохранить нужно будет два файла. Первый - файл модуля, второй - проектный файл. По умолчанию файлу модуля присваи­ вается имя U n i t l . срр, проектному файлу - P ro j e c t l . срр. На самом деле при сохранении проекта создается 7 файлов:

- U n i t l . срр, - U n i t l .h ,

- U n i t l . dfm,

- P r o j e c t l . c b p r o j ,

- P r o j e c t l . c b p r o j . l o c a l , - P r o j e c t l . c p p ,

- P r o j e c t l . r e s .

Примечание. Выполнение команды F ile - > S a v e или нажа-

m

тие кнопки в на панели инструментов приводит к сохранению текущего файла.

В версии C-H-Builder 2007 в головном каталоге проекта соз­ даются папки:

- _ h i s t o r y , которая используется для хранения прежних версий проекта;

- D e b u g , в которой компилятор создает файлы . o b j, . t d s ,

. е х е и т.д.

1.3.4. Запуск приложения

Для запуска приложения нужно выполнить одну из следую­ щих команд:

- нажать клавишу F9;

- нажать кнопку на панели инструментов; - выполнить команду меню Run - >Run.

При зависании программы, запущенной из интегрированной среды C++Builder, необходимо выполнить одну из следующих ко­ манд:

- для приостановки выполнения программы выбрать команду

меню R un - > P ro g ram

P a u se . В данном случае можно выяснить

причину зависания программы;

 

- д л я

завершения

программы нажать комбинацию

клавиш

C tr l+ F 2

или выполнить команду меню R un- > P ro g ram

R e s e t.

1.4. Создание приложений в C++Builder

Программирование в C++Builder строится на тесном взаимо­ действии двух процессов:

-процесса создания элементов визуального интерфейса;

-процесса написания кода программы.

Программные средства разработки приложений, относящиеся к предыдущему поколению, предлагают различные интерактивные средства решения типовых задач (мастера в Borland C++ и вол­ шебники (Wizard) в Visual C++), которые в диалоге с программи­ стом создают и вставляют в программы готовые фрагменты ис­ ходного кода.