C++Builder. Учебный курс
.pdfботки поступающих от 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++), которые в диалоге с программи стом создают и вставляют в программы готовые фрагменты ис ходного кода.