Программирование с C++ Builder

         

и событийного программирования займемся разработкой



Для демонстрации возможностей C++ Builder и технологии визуального проектирования и событийного программирования займемся разработкой программы, используя которую можно вычислить силу тока в электрической цепи. Сила тока вычисляется по известной формуле: I = U/R, где U — напряжение источника (вольт); R — величина сопротивления (Ом). Вид диалогового окна программы во время ее работы (после щелчка на кнопке Вычислить) приведен на рис. 2.1.


Рис. 2.1. Окно программы вычисления силы тока в электрической цепи

Чтобы начать разработку нового приложения (так принято называть прикладные программы), надо запустить C++ Builder или, если C++ Builder уже запущен, в меню File выбрать команду New | Application.

Форма



Работа над новым проектом (так в C++ Builder называется разрабатываемое приложение) начинается с создания стартовой формы — главного окна программы.

Стартовая форма создается путем изменения значений свойств формы Form1(настройки формы) и добавления к форме необходимых компонентов (полей ввода, полей вывода текстовой информации, командных кнопок).

Основные свойства формы, которые определяют ее вид и поведение во время работы программы, приведены в табл. 2.1.

Таблица 2.1. Свойства формы (объекта Form)

Свойство
Описание
Name
Имя формы. В программе имя формы используется для управления формой и доступа к компонентам формы
Caption
Текст заголовка
Width
Ширина формы
Height
Высота формы
Top
Расстояние от верхней границы формы до верхней границы экрана
Left
Расстояние от левой границы формы до левой границы экрана
BorderStyle
Вид границы. Граница может быть обычной (bssizeable), тонкой (bsSingle) или отсутствовать (bsNone). Если у окна обычная граница, то во время работы программы пользователь может при помощи мыши изменить размер окна. Изменить размер окна с тонкой границей нельзя. Если граница отсутствует, то на экран во время работы программы будет выведено окно без заголовка. Положение и размер такого окна во время работы программы изменить нельзя
Borderlcons
Кнопки управления окном. Значение свойства определяет, какие кнопки управления окном будут доступны пользователю во время работы программы. Значение свойства задается путем присвоения значений уточняющим свойствам biSystemMenu, biMinimaze, biMaximaze и biHelp. Свойство biSystemMenu определяет доступность кнопки Свернуть и кнопки системного меню, biMinimaze — кнопки Свернуть, biMaximaze— кнопки Развернуть, biHelp — кнопки вывода справочной информации
Icon
Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню
Color
Цвет фона. Цвет можно задать, указав название цвета или привязку к текущей цветовой схеме операционной системы. Во втором случае цвет определяется текущей цветовой схемой, выбранным компонентом привязки и меняется при изменении цветовой схемы операционной системы
Font
Шрифт. Шрифт, используемый "по умолчанию" компонентами, находящимися на поверхности формы. Изменение свойства Font формы приводит к автоматическому изменению свойства Font компонента, располагающегося на поверхности формы. То есть компоненты наследуют свойство Font от формы (имеется возможность запретить наследование)


Для изменения значений свойств объектов, в том числе и формы, используется вкладка Properties (Свойства) диалогового окна Object Inspector. В левой колонке этой вкладки перечислены свойства выбранного объекта, в правой — указаны значения свойств.

При создании формы в первую очередь следует изменить значение свойства Caption (Заголовок). В нашем примере надо заменить текст Form1 на Сила тока. Чтобы это сделать, нужно в окне Object Inspector щелкнуть левой кнопкой мыши в строке Caption (в результате будет выделено значение свойства и появится курсор) и ввести текст: сила тока (рис. 2.2).



Рис. 2.2. Изменение значения свойства Caption путем ввода значения


Аналогичным образом можно установить значения свойств Height и width, которые определяют высоту и ширину формы. Размер формы, а также размер других компонентов задают в пикселах, т. е. точках экрана. Свойствам Height и width надо присвоить значения 200 и 330, соответственно.

Форма — это обычное окно. Поэтому размер формы можно изменить точно так же, как размер любого окна Windows, т. е. путем перетаскивания границы. По окончании перемещения границы значения свойств Height и width автоматически изменятся. Они будут соответствовать установленному размеру формы.

Положение диалогового окна на экране после запуска программы соответствует положению формы во время разработки, которое определяется значением свойств тор (отступ от верхней границы экрана) и Left (отступ от левой границы экрана). Значения этих свойств также можно задать путем перемещения формы при помощи мыши.

При выборе некоторых свойств, например, Borderstyle, справа от текущего значения свойства появляется значок раскрывающегося списка. Очевидно, что значение таких свойств можно задать путем выбора из списка (рис. 2.3).

Некоторые свойства являются сложными, т. е. их значение определяется совокупностью значений других (уточняющих) свойств. Например, свойство Border icons определяет, какие кнопки управления окном будут доступны во время работы программы. Значения этого свойства определяется совокупностью значений свойств MSystemMenu, biMinimize, biMaximize и biHelp, каждое из которых, в свою очередь, определяет наличие соответствующей командной кнопки в заголовке окна во время работы программы. Перед именами сложных свойств стоит значок "+", в результате щелчка на котором раскрывается список уточняющих свойств (рис. 2.4), значения которых можно задать обычным образом (ввести в поле или выбрать в списке допустимых значений).



Рис. 2.3. Установка значения свойства путем выбора из списка



Рис. 2.4. Изменение значения уточняющего свойства


В результате выбора некоторых свойств (щелчка кнопкой мыши на свойстве), рядом со значением свойства появляется командная кнопка с тремя точками. Это значит, что задать значение свойства можно в дополнительном диалоговом окне, которое появится в результате щелчка на этой кнопке. Например, значение сложного свойства Font можно задать в окне Object Inspector путем ввода значений уточняющих свойств, а можно воспользоваться стандартным диалоговым окном Шрифт, которое появится в результате щелчка на кнопке с тремя точками (рис. 2.5).

В табл. 2.2 перечислены свойства формы разрабатываемой программы, которые следует изменить. Остальные свойства формы оставлены без изменения и в таблице не приведены. В приведенной таблице в именах некоторых свойств есть точка. Это значит, что надо задать значение уточняющего свойства.



Рис. 2.5. Чтобы задать свойства шрифта, щелкните на кнопке с тремя точками


Таблица 2.2. Значения свойств стартовой формы

Свойство
Значение
Комментарий
Caption
Сила тока
 
Height
200
 
Width
330
 
BorderStyle
bsSingle
Тонкая граница не позволяет изменить размер окна во время работы программы путем захвата и перемещения границы
Borderlcons.biMinimize
False
В заголовке окна нет кнопки Свернуть
Borderlcons.biMaximize
False
В заголовке окна нет кнопки Развернуть
Font . Name
Tahoma
 
Font. Size
10
 

Компоненты



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

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

Для того чтобы в форму разрабатываемого приложения добавить поле редактирования, надо в палитре компонентов, на вкладке Standard, щелкнуть на значке компонента Edit (рис. 2.6), установить курсор в ту точку формы, в которой должен быть левый верхний угол компонента, и еще раз щелкнуть кнопкой мыши. В результате на форме появляется компонент Edit — поле редактирования (рис. 2.7).



Рис. 2.6. Компонент Edit — поле редактирования



Рис. 2.7. Результат добавления в форму компонента Edit


Каждому добавленному компоненту автоматически присваивается имя, которое состоит из названия компонента и его порядкового номера. Например, если к форме добавить два компонента Edit, то их имена будут Edit1 и Edit2. Программист путем изменения значения свойства Name может изменить имя компонента. Однако в простых программах имена компонентов, как правило, не изменяют.

Основные свойства компонента Edit приведены в табл. 2.3.

Таблица 2.3. Свойства компонента Edit (объект типа TEdit)

Свойство
Определяет (задает)
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам, в том числе к тексту, который находится в поле редактирования
Text
Текст, который находится в поле ввода/редактирования
Left
Расстояние от левой границы компонента до левой границы формы
Top
Расстояние от верхней границы компонента до верхней границы формы
Height
Высоту поля
Width
Ширину поля
Font
Шрифт, используемый для отображения вводимого текста
ParentFont
Признак


На рис. 2.8 приведен вид формы после добавления двух полей редактирования. Один из компонентов выбран (выделен), окружен восемью маленькими квадратиками. Свойства выбранного компонента отображаются в окне Object Inspector. Чтобы увидеть и, если надо, изменить свойства другого компонента, надо этот компонент выбрать, щелкнув левой кнопкой мыши на изображении компонента, или выбрать имя компонента в раскрывающемся списке, который находится в верхней части окна Object Inspector (рис. 2.9). Компонент, свойства которого надо увидеть или изменить, можно выбрать и в окне Object TreeView (рис. 2.10).



Рис. 2.8. Форма с двумя компонентами


Значения некоторых свойств компонента, определяющих, например, размер и положение компонента на поверхности формы, можно изменить при помощи мыши.



Рис. 2.9. Выбор компонента в окне Object Inspector




Рис. 2.10. Выбор компонента в окне Object TreeView


Для того чтобы изменить положение компонента, необходимо установить курсор мыши на его изображение, нажать левую кнопку мыши и, удерживая ее нажатой, переместить контур компонента в нужную точку формы, а затем отпустить кнопку мыши. Во время перемещения компонента (рис. 2.11) отображаются текущие значения координат левого верхнего угла компонента (значения свойств Left и тор).



Рис. 2.11. Отображение значений свойств Left и Тор при изменении положения компонента


Для того чтобы изменить размер компонента, необходимо его выделить, установить указатель мыши на один из маркеров, помечающих границу компонента, нажать левую кнопку мыши и, удерживая ее нажатой, изменить положение границы компонента. Затем отпустить кнопку мыши. Во время изменения размера компонента отображаются его текущие размеры: высота и ширина (значения свойств Height и width) (рис. 2.12).



Рис. 2.12. Отображение значений свойств Height и Width при изменении размера компонента


В табл. 2.4 приведены значения свойств компонентов Edit1 и Edit2 разрабатываемого приложения (значения остальных свойств оставлены без изменения и поэтому в таблице не приведены). Компонент Edit1 предназначен для ввода величины напряжения, Edita — для ввода величины сопротивления. Обратите внимание, значением свойства Text обоих компонентов является пустая строка. В результате форма разрабатываемого приложения должна выглядеть так, как показано на рис. 2.13.

Таблица 2.4. Значения свойств компонентов Edit1 и Edit2

  Свойство Компонент
Edit1
Edit2
Text
   
Тор
48
72
Left
144
144
Width
65
65



Рис. 2.13. Форма после настройки компонентов Edit


Помимо полей редактирования в окне программы находится текст — краткая информация о программе и назначении полей ввода.

Для вывода текста на поверхность формы используют поля вывода текста. Поле вывода текста — это компонент Label. Значок компонента Label находится на вкладке Standard (рис. 2.14). Добавляется компонент Label в форму точно так же, как и поле редактирования. Основные свойства компонента Label перечислены в табл. 2.5.



Рис. 2.14. Компонент Label — поле вывода текста


Таблица 2.5. Свойства компонента Label

Свойство
Определяет (задает)
Name
Имя компонента. Используется в программе для доступа к свойствам компонента
Caption
Отображаемый текст
Font
Шрифт, используемый для отображения текста
ParentFont
Признак наследования шрифта родительского компонента
AutoSize
Признак того, что размер поля определяется его содержимым
Left
Расстояние от левой границы поля вывода до левой границы формы
Top
Расстояние от верхней границы поля вывода до верхней границы формы
Height
Высоту поля вывода
Width
Ширину поля вывода
Wordwrap
Признак того, что слова, которые не помещаются в текущей строке, автоматически переносятся на следующую строку (значение свойства AutoSize должно быть false)


Если поле Label должно содержать несколько строк текста, то перед тем как ввести в поле текст (изменить значение свойства Caption), нужно присвоить свойству AutoSize значение false, а свойству wordwrap — true. Затем надо установить требуемый размер поля (при помощи мыши или вводом значений свойств Height и width) и только после этого ввести значение свойства Caption.

В форму разрабатываемого приложения надо добавить четыре компонента Label. Поле Label1 предназначено для вывода информационного сообщения, поля Label2 и Labels — для вывода информации о назначении полей ввода, поле Label4 — для вывода результата расчета (величины тока в цепи). После добавления компонентов надо выполнить их настройку — установить значения свойств (табл. 2.6). Прочерк в таблице означает, что значение свойства оставлено без изменения или установлено автоматически — например, как результат изменения другого свойства. В результате форма разрабатываемого приложения должна выглядеть так, как показано на рис. 2.15.

Таблица 2.6. Значения свойств компонентов Label1 — Label4

 Свойство   Компонент 
Label1
Label2
Label3
Label4
AutoSize
false
true
true
fablse
Wordwrap
true
false
false
true
Caption Введите напряжение и величину сопротивления, затем щелкните на кнопке Вычислить Напряжение (вольт) Сопротивление (Ом)  
Top 8 56 80 112
Left  8 8 8  8
Height 33 16 16 16
 Width
 300
120
120
200



Рис. 2.15. Вид формы после добавления и настройки полей вывода текста


Последнее, что надо сделать на этапе создания формы — это добавить в форму две командные кнопки: Вычислить и Завершить. Назначение этих кнопок очевидно.

Командная кнопка — компонент Button — добавляется в форму точно так же, как и другие компоненты. Значок компонента Button находится на вкладке Standard (рис. 2.16). Основные свойства компонента Button приведены в табл. 2.7.



Рис. 2.16. Командная кнопка — компонент Button


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

Таблица 2.7. Свойства компонента Button (командная кнопка)

Свойство
Описание
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам
Caption
Текст на кнопке
Enabled
Признак доступности кнопки. Кнопка доступна, если значение свойства равно true, и недоступна, если значение свойства равно false
. Left
Расстояние от левой границы кнопки до левой границы формы
Top
Расстояние от верхней границы кнопки до верхней границы формы
Height
Высота кнопки
Width
Ширина кнопки


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

Окончательный вид формы разрабатываемого приложения приведен на рис. 2.17.



Рис. 2.17. Окончательный вид формы программы "Сила тока"


Завершив работу над формой, можно приступить к созданию программы. Но перед этим рассмотрим два важных понятия: событие и функцию обработки события.

Таблица 2.8. Значения свойств компонентов Button1  и Button2

  Свойство Компонент
Button1
Button2
Caption
Вычислить
Завершить
Top
144
144
Left
16
104
Height
25
25
Width
75
75

Событие и функция обработки события



Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести в поля редактирования исходные данные и щелкнуть мышью на кнопке Вычислить. Щелчок на изображении командной кнопки — это пример того, что в Windows называется событием.

Событие (Event) — это то, что происходит во время работы программы. В C++ Builder каждому событию присвоено имя. Например, щелчок кнопкой мыши — это событие Onclick, двойной щелчок мышью — событие OnDb1Click.

В табл. 2.9 приведены некоторые события Windows.

Таблица 2.9. События

Событие
Происходит
OnClick
При щелчке кнопкой мыши
OnDb1Click
При двойном щелчке кнопкой мыши
OnMouseDown
При нажатии кнопки мыши
OnMouseUp
При отпускании кнопки мыши
OnMouseMove
При перемещении мыши
OnKeyPress
При нажатии клавиши клавиатуры
OnKeyDown
При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress — это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)
OnKeyUp
При отпускании нажатой клавиши клавиатуры
OnCreate
При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий
On Paint
При появлении окна на экране в начале работы программы; во время работы программы после появления окна (или его части), которое было закрыто другим окном или свернуто
OnEnter
При получении элементом управления фокуса
OnExit
При потере элементом управления фокуса


Реакцией на событие должно быть какое-либо действие. В C++ Builder реакция на событие реализуется как функция обработки события. Таким образом, для того чтобы программа выполняла некоторую работу в ответ на действия пользователя, программист должен написать функцию обработки соответствующего события. Следует обратить внимание на то, что значительную часть обработки событий берет на себя компонент. Поэтому программист должен разрабатывать функцию обработки события только в том случае, если реакция на событие отличается от стандартной или не определена. Например, если по условию задачи ограничений на символы, вводимые в поле Edit, нет, то процедуру обработки события onKeypress писать не надо, т. к. во время работы программы будет использована стандартная (скрытая от программиста) процедура обработки этого события.

Методику создания функций обработки событий рассмотрим на примере функции обработки события onclick для командной кнопки Вычислить.

Чтобы приступить к созданию функции обработки события, сначала надо выбрать компонент, для которого создается функция обработки события. Выбрать компонент можно в окне Object Inspector или щелчком на изображении компонента в форме. После этого в окне Object Inspector нужно выбрать вкладку Events (События).

В левой колонке вкладки Events (рис. 2.18) перечислены события, которые может воспринимать выбранный компонент (имя и тип компонента указаны в верхней части окна). Если для события определена функция обработки, то в правой колонке рядом с именем события будет выведено имя этой функции.

Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в окне Object Inspector, в поле функции обработки соответствующего события (рис. 2.19). В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector рядом с именем события появится сгенерированное C++ Builder имя функции обработки события (рис. 2.19).



Рис. 2.18. На вкладке Events перечислены события, которые может воспринимать компонент (в данном случае — командная кнопка)



Рис. 2.19. Шаблон функции обработки события, сгенерированный C++ Builder


C++ Builder присваивает функции обработки события имя, которое состоит из двух частей. Первая часть имени идентифицирует форму, содержащую объект (компонент), для которого создана процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем примере имя формы — Form1, имя командной кнопки — Button1, а имя события — Click.

В окне редактора кода между фигурными скобками можно набирать инструкции, реализующие функцию обработки события.

В листинге 2.1 приведен текст функции обработки события onclick для командной кнопки Вычислить. Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным шрифтом, комментарии — курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами в соответствии с принятыми в среде программистов правилами хорошего стиля.

Листинг 2.1. Простейшая обработка события onclick на кнопке Вычислить

void__fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
u = StrToFloat(Editl->Text);
r = StrToFloat(Edit2->Text);
// вычислить ток
i = u/r;
// вывести результат в поле метки
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + "А";
}

Функция Button1Click выполняет расчет силы тока и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text. Свойство Text содержит строку символов, которую ввел пользователь. Чтобы программа работала правильно, пользователь должен ввести в каждое поле редактирования целое или дробное число в правильном формате (при вводе дробного числа для разделения целой и дробной частей надо использовать запятую). Так как поле редактирования содержит текст (свойство Text строкового типа), необходимо выполнить преобразование строки в число. Эту задачу решает функция strToFloat, которой в качестве параметра передается содержимое поля редактирования — значение свойства Text (Edit1->Text — это содержимое поля Edit1). Функция strToFloat проверяет символы строки, переданной ей в качестве параметра, на допустимость и, если все символы верные, возвращает значение, соответствующее строке, полученной в качестве параметра.

После того как исходные данные будут помещены в переменные u и r, выполняется расчет.

Вычисленная величина силы тока выводится в поле Label4 путем присваивания значения свойству Caption. Для преобразования числа в строку символов (свойство Caption— строкового типа) используется функция FloatToStrF.

В листинге 2.2 приведена процедура обработки события onclick на командной кнопке Завершить. Создается она точно так же, как и процедура обработки события onclick для командной кнопки Вычислить. В результате щелчка на кнопке Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть окно программы. Делает это метод close.

Листинг 2.2. Процедура обработки события Onclick на кнопке Завершить
void __fastcall TForml::Button2Click(TObject*Sender)
{
Forml->Close();
}

Редактор кода



Во время набора текста программы редактор кода автоматически выделяет элементы программы: полужирным шрифтом — ключевые слова языка программирования (if, else, int, float и др.), курсивом — комментарии. Это делает текст программы более выразительным, что облегчает восприятие структуры программы.

В процессе разработки программы часто возникает необходимость переключения между окном редактора кода и окном формы. Сделать это можно при помощи командной кнопки Toggle Form/Unit, которая находится на панели инструментов View (рис. 2.20), или нажав клавишу <F12>. На панели инструментов View находятся командные кнопки View Unit и View Form, используя которые можно выбрать нужный модуль или форму в случае, если проект состоит из нескольких модулей или форм.



Рис. 2.20. Кнопка Toggle Form/Unit позволяет быстро переключаться между формой и редактором кода


Система подсказок



Редактор кода поддерживает функцию контекстно-зависимой подсказки, которая во время набора текста программы автоматически выводит краткую справочную информацию о свойствах и методах объектов, о параметрах функций.

Например, после того как будет набрано имя объекта (компонента) и символы ->, редактор кода автоматически выведет список свойств и методов объекта (рис. 2.21). Программисту останется только выбрать из списка нужный элемент и нажать клавишу <Enter> (быстро перейти к нужному элементу списка или к области, где этот элемент находится, можно, нажав клавишу, соответствующую первому символу этого элемента).



Рис. 2.21. Редактор кода автоматически выводит список свойств и методов объекта (компонента)


Следует обратить внимание, что если список свойств и методов не появляется, то это значит, что в программе обнаружена ошибка (C++ Builder контролирует правильность набираемого программистом текста в "фоновом" режиме). Например, если в окне редактора кода набрать if Edit1->, то список свойств и методов объекта Edit1 не появится, т. к. инструкция if в данном случае записана с ошибкой (не поставлена открывающая скобка после if). C++ Builder информирует программиста об обнаруженной ошибке сообщением Unable to invoke Code Completion due to errors in source code, которое появляется в нижней части окна редактора кода.

После набора имени встроенной или объявленной программистом функции редактор кода также выводит подсказку: список параметров. Параметр, который в данный момент вводит программист, в подсказке выделен полужирным. Например, если набрать слово FloatToStrF, которое является именем функции преобразования дробного числа в строку символов, и открывающую скобку, то на экране появится окно, в котором будет указан список параметров функции (рис. 2.22).



Рис. 2.22. Пример подсказки


Навигатор классов



Окно редактора кода разделено на две части (рис. 2.23). В правой части находится текст программы. Левая часть, которая называется навигатор классов (ClassExplorer), облегчает навигацию по тексту (коду) программы. В иерархическом списке, структура которого зависит от проекта, над которым идет работа, перечислены объекты проекта (формы и компоненты) и функции обработки событий. Выбрав элемент списка, можно быстро перейти к нужному фрагменту кода, например к функции обработки события.



Рис. 2.23. Окно ClassExplorer облегчает навигацию по тексту программы


Окно навигатора классов можно закрыть обычным образом. Если окно навигатора классов не доступно, то для того чтобы оно появилось на экране, нужно в меню View выбрать команду ClassExplorer.


Шаблоны кода



В процессе набора текста удобно использовать шаблоны кода (Code Templates). Шаблон кода — это инструкция программы, записанная в общем виде. Например, шаблон для инструкции if выглядит так:

if ()
{
}
else
{
}

Редактор кода предоставляет программисту большой набор шаблонов: объявления классов, функций, инструкций выбора (if, switch), циклов (for, while). Для некоторых инструкций, например для if и while, есть несколько вариантов шаблонов.

Для того чтобы в процессе набора текста программы воспользоваться шаблоном кода и вставить его в текст программы, нужно нажать комбинацию клавиш <Ctrl>+<J> и из появившегося списка выбрать нужный шаблон (рис. 2.24). Выбрать шаблон можно обычным образом, прокручивая список, или вводом первых букв имени шаблона (имена шаблонов в списке выделены полужирным). Выбрав в списке шаблон, нужно нажать клавишу <Enter>, шаблон будет вставлен в текст программы.



Рис. 2.24. Список шаблонов кода отображается в результате нажатия <Ctrl>+<J>



Рис. 2.25. В поля диалогового окна надо ввести имя шаблона и его краткое описание


Программист может создать свой собственный шаблон кода и использовать его точно так же, как и стандартный. Для того чтобы создать шаблон кода, нужно в меню Tools выбрать команду Editor Options и в окне Code Insight щелкнуть на кнопке Add. В появившемся окне Add Code Template (рис. 2.25) надо задать имя шаблона (Shortcut Name) и его краткое описание (Description). Затем, после щелчка на кнопке ОК, в поле Code надо ввести шаблон (рис. 2.26).



Рис. 2.26. Пример шаблона кода программиста


Справочная система



В процессе набора текста программы можно получить справку о конструкции языка, типе данных, классе или функции. Для этого нужно в окне редактора кода набрать слово, о котором надо получить справку (например, имя функции), и нажать клавишу <F1>. Так как с запрашиваемой темой в справочной системе может быть связано несколько разделов, на экране, как правило, появляется окно Найденные разделы (рис. 2.27), в котором можно выбрать нужный раздел. Следует обратить внимание на то, что после имени функции может быть указано имя библиотеки, к которой эта функция относится: VCL или CLX (вспомните: библиотека VCL используется при разработке приложений для Windows, a CLX — при разработке кроссплатформенных приложений). Поэтому, выбирая раздел справочной системы, надо обращать внимание на то, к какой библиотеке он относится.



Рис. 2.27. В диалоговом окне следует уточнить раздел

Справочную информацию можно получить также, выбрав из меню Help команду C++ Builder Help. В этом случае на экране появится стандартное окно справочной системы. В этом окне на вкладке Предметный указатель нужно ввести ключевое слово, определяющее тему, по которой нужна справка. В качестве ключевого слова можно ввести, например, первые несколько букв имени функции, свойства или метода (рис. 2.28).



Рис. 2.28. Поиск справочной информации по ключевому слову


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



Проект — это набор файлов, используя которые компилятор создает выполняемый файл программы (ехе-файл). В простейшем случае проект составляют: файл описания проекта (bpr-файл), файл главного модуля (срр-файл), файл ресурсов (res-файл), файл описания формы (dfm-файл), заголовочный файл формы (h-файл) и файл описания функций формы (срр-файл).

Чтобы сохранить проект, нужно в меню File выбрать команду Save Project As. Если проект еще ни разу не был сохранен, то C++ Builder сначала предлагает сохранить модуль (содержимое окна редактора кода) и поэтому на экране появляется окно Save Unitl As. В этом окне (рис. 2.29) надо выбрать папку, предназначенную для проектов, создать в ней папку для сохраняемого проекта, открыть ее и ввести имя модуля. В результате щелчка на кнопке OK в указанной папке будут созданы три файла: срр, h и dfm, и на экране появится диалоговое окно Save Projectl As (рис. 2.30), в которое надо ввести имя проекта.



Рис. 2.29. Сохранение модуля



Рис. 2.30. Сохранение проекта


Обратите внимание, что имена файла модуля (срр) и файла проекта (bрr) должны быть разными, т. к. C++ Builder в момент сохранения файла проекта создает одноименный срр-файл (файл главного модуля). Кроме того, надо учесть, что имя генерируемого компилятором выполняемого файла совпадает с именем проекта. Поэтому файлу проекта следует присвоить такое имя, которое, по вашему мнению, должен иметь выполняемый файл программы, а файлу модуля — какое-либо другое имя, например, полученное путем добавления к имени проекта порядкового номера модуля.


Компиляция



Процесс преобразования исходной программы в выполняемую состоит из двух этапов: непосредственно компиляции и компоновки. На этапе компиляции выполняется перевод исходной программы в некоторое внутреннее представление. На этапе компоновки выполняется сборка (построение) программы.

После ввода текста функции обработки события и сохранения проекта можно, выбрав в меню Project команду Compile, выполнить компиляцию. Процесс и результат компиляции отражается в диалоговом окне Compiling (рис. 2.31). Если в программе нет синтаксических ошибок, то окно будет содержать сообщение: Done: Compile Unit, в противном случае будет выведено сообщение Done: There are errors.



Рис. 2.31. Результат компиляции: в программе есть ошибки


В случае если компилятор обнаружит в программе ошибки и неточности, диалоговое окно Compiling будет содержать информацию о количестве синтаксических (Errors) и семантических (Warnings) ошибок, а также о числе подсказок (Hints). Сами сообщения об ошибках, предупреждения и подсказки находятся в нижней части окна редактора кода.

Чтобы перейти к фрагменту кода, который, по мнению компилятора, содержит ошибку, надо выбрать сообщение об ошибке (щелкнуть в строке сообщения левой кнопкой мыши) и из контекстного меню (рис. 2.32) выбрать команду Edit Source.



Рис. 2.32. Переход к фрагменту программы, который содержит ошибку


Процесс компиляции можно активизировать, выбрав в меню Run команду Run, которая запускает разрабатываемое приложение. Если будет обнаружено, что с момента последней компиляции в программу были внесены изменения или программа еще ни разу не компилировалась, то будет выполнена компиляция, затем — компоновка, и после этого программа будет запущена (естественно, только в том случае, если в программе нет ошибок).


Ошибки



Компилятор переходит ко второму этапу генерации выполняемой программы только в том случае, если исходный текст не содержит синтаксических ошибок. В большинстве случаев в только что набранной программе есть ошибки. Программист должен их устранить. Процесс устранения ошибок носит итерационный характер. Обычно сначала устраняются наиболее очевидные ошибки, например, объявляются необъявленные переменные. После очередного внесения изменений в текст программы выполняется повторная компиляция. Следует обратить внимание на то, что компилятор не всегда может точно локализовать ошибку. Поэтому, анализируя фрагмент программы, который, л о мнению компилятора, содержит ошибку, нужно обращать внимание не только на тот фрагмент кода, на который компилятор установил курсор, но и на тот, который находится в предыдущей строке. Например, в следующем фрагменте кода:

// вычислить ток
i = u/r
//. вывести результат в поле метки
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + " А";

не поставлена точка с запятой после оператора присваивания. Компилятор это обнаруживает, выводит сообщение statement missing ;, но выделяет строку Label4->caption = "Ток : " + и устанавливает курсор после идентификатора Label4.

В табл. 2.10 перечислены типичные ошибки и соответствующие им сообщения компилятора.

Таблица 2.10. Типичные ошибки

Сообщение
Ошибка
Undefined symbol (неизвестный символ)
Используется необъявленная переменная Имя переменной, функции или параметра записано неверно. Например, в программе объявлена переменная Summ, а в инструкциях используется sum
Statement missing ; (отсутствует точка с запятой)
После инструкции не поставлена точка с запятой
Unterminated string or character constant (незаконченная строковая или символьная константа)
В конце строковой константы, например, текста сообщения, нет двойных кавычек
) expected (ожидается закрывающая скобка)
При записи арифметического выражения, содержащего скобки, нарушен баланс открывающих и закрывающих скобок
if statement missing ( (в инструкции if нет открывающей скобки)
В инструкции if условие не заключено в скобки
Compound statement missing }
Нарушен баланс открывающих и закрывающих фигурных скобок. Вероятно, не поставлена закрывающая фигурная скобка отмечающая конец функции или группы инструкций, например, после условия или слова else в инструкции if
Extra parameter in call to (лишний параметр при вызове функции)
Неверно записана инструкция вызова функции, указан лишний параметр


Если компилятор обнаружил достаточно много ошибок, то просмотрите все сообщения и устраните сначала наиболее очевидные ошибки и выполните повторную компиляцию. Вполне вероятно, что после этого количество ошибок значительно уменьшится. Это объясняется особенностями синтаксиса языка, когда одна незначительная ошибка может "тащить" за собой довольно большое количество других.

Предупреждения и подсказки



При обнаружении в программе неточностей, которые не являются ошибками, компилятор выводит подсказки (Hints) и предупреждения (Warnings). Например, наиболее часто выводимой подсказкой является сообщение об объявленной, но не используемой переменной (... is declared but never used.). Действительно, зачем объявлять переменную и не использовать ее? В табл. 2.11 приведены предупреждения, наиболее часто выводимые компилятором.

Таблица 2.11. Предупреждения компилятора

Предупреждение
Вероятная причина
... is declared but never used  
Possibly incorrect assignment. (вероятно, инструкция присваивания некорректная)
В условии, например, инструкции if, вместо оператора сравнения (=) использован оператор присваивания (=)
Possibly use of ... before definition. (вероятно, используется неинициализированная переменная)
Не присвоено начальное значение переменной

Компоновка



Если в программе нет ошибок, то можно выполнить компоновку. Для этого надо в меню Compile выбрать команду Make или Build. Разница между командами Make и Build заключается в следующем. Команда Make обеспечивает компоновку файлов проекта, а команда Build — принудительную перекомпиляцию, а затем — компоновку.

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


Запуск программы



Пробный запуск программы можно выполнить непосредственно из среды разработки, не завершая работу с C++ Builder. Для этого нужно в меню Run выбрать команду Run или щелкнуть на командной кнопке Run (рис. 2.33).



Рис. 2.33. Запуск программы из среды разработки


Ошибки времени выполнения



Во время работы приложения могут возникать ошибки, которые называются ошибками времени выполнения (run time errors) или исключениями (exceptions). В большинстве случаев причинами исключений являются неверные исходные данные.

Например, если во время работы программы вычисления силы тока в поле Напряжение ввести ю.5, т. е. разделить целую и дробную часть точкой, то в результате щелчка на кнопке Вычислить на экране появится окно с сообщением об ошибке (рис. 2.34).



Рис. 2.34. Пример окна с сообщением об ошибке времени выполнения (программа запущена из Windows)


Причина возникновения ошибки в следующем. В тексте программы дробная часть числа от целой отделяется точкой. При вводе данных в поле редактирования пользователь может отделить дробную часть числа от целой точкой или запятой. Какой из этих двух символов является правильным, зависит от настройки Windows.

Если в настройке Windows указано, что разделитель целой и дробной частей числа — запятая (для России это стандартная установка), а пользователь использовал точку (ввел в поле Напряжение (Edit1) строку 10.5), то при выполнении инструкции

u = StrToFloat(Editl->Text);

возникнет исключение, т. к. при указанной настройке Windows содержимое поля редактирования и, следовательно, аргумент функции StrToFloat не является изображением дробного числа.

Если программа запущена из среды разработки, то при возникновении исключения выполнение программы приостанавливается и на экране появляется окно с сообщением об ошибке и ее типе. В качестве примера на рис. 2.35 приведено окно сообщения о возникновении исключения, причина которого заключается в том, что строка, введенная пользователем в поле редактирования, не является дробным числом.



Рис. 2.35. Пример сообщения о возникновении исключения (программа запущена из C++ Builder)


После возникновения исключения и щелчка на кнопке ОК в диалоговом окне Debugger Exception Notification (рис. 2.35) выполнение программы можно прервать или, несмотря на возникшую ошибку, продолжить. Чтобы прервать выполнение программы, надо в меню Run выбрать команду Program Reset, чтобы продолжить — команду Step Over.

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

Инструкция обработки исключения выглядит так:

try
{
// здесь инструкции, выполнение которых может вызвать исключение
}
catch ( Тип &е)
{
// здесь инструкции обработки исключения
}

где:

try — ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа; catch — ключевое слово, обозначающее начало секции обработки исключения. Инструкции этой секции будут выполнены, если в программе возникнет исключение указанного типа.


Основной характеристикой исключения является его тип. В табл. 2.12 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.

Таблица 2.12. Типичные исключения

Исключение
Возникает
EConvertError — ошибка преобразования
При выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому типу. Наиболее часто возникает при преобразовании строки символов в число
EDivByZero — целочисленное деление на ноль
При выполнении операции целочисленного деления, если делитель равен нулю
EZeroDivide — деление на ноль
При выполнении операции деления над дробными операндами, если делитель равен нулю
EInOutError — ошибка ввода/вывода
При выполнении файловых операций. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе


В программе вычисления силы тока исключения могут возникнуть при выполнении преобразования строк, введенных в поля редактирования, в числа и при вычислении величины тока. Исключение EConvertError возникнет, если пользователь неправильно введет числа в поля редактирования: например, разделит целую и дробную части точкой. Исключение EZeroDivide возникнет, если пользователь задаст величину сопротивления равной нулю. В листинге 2.3 приведена функция обработки события Onclick на командной кнопке Вычислить. В функцию включены инструкции обработки исключений.

Листинг 2.3. Обработка исключений

void __fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
// возможно исключение — ошибка преобразования строки в число
try
{
u = StrToFloat(Editl->Text); г = StrToFloat(Edit2->Text);
}
catch (EConvertError &e)
(
ShowMessage("При вводе дробных чисел используйте запятую.");
return;
}
// вычислить ток
// возможно исключение — деление на ноль
try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2->SetFocus(); // курсор а поле Сопротивление
return; }
// вывести результат в поле метки
Label4->Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,3);
}

В приведенной функции для вывода сообщений в случае возникновения исключений использована функция ShowMessage, которая выводит на экран окно с текстом и командной кнопкой ОК. Инструкция вызова функции ShowMessage выглядит так: ShowMessage(Сообщение) ;

Где сообщение — строковая константа (текст, который надо вывести). На рис. 2.36 приведен вид окна сообщения, полученного в результате выполнения инструкции: ShowMessage("Величина сопротивления не должна быть равна нулю.");



Рис. 2.36. Сообщение, выведенное функцией ShowMessage


Следует обратить внимание на то, что в заголовке окна сообщения, выводимого функцией ShowMessage, указывается название приложения. Название приложения задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла.

Для вывода сообщений можно использовать функцию MessageDig. Функция MessageDig позволяет поместить в окно с сообщением один из стандартных значков, например "Внимание", задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. На рис. 2.37 приведено окно, выведенное в результате выполнения инструкции

MessageDig("Файл c:\Xtemp\\test.txt будет удален.",
mtWarning, TMsgDlgButtons() « mbOK « mbCancel, 0);



Рис. 2.37. Пример окна сообщения


Значение функции MessageDig — число, проверив значение которого можно определить, выбором какой командной кнопки был завершен диалог. В общем виде обращение к функции MessageDig выглядит так:

Выбор:= MessageDig(Сообщение, Тип, Кнопки, КонтекстСправки)

где:

сообщение — текст сообщения; Тип — тип сообщения. Сообщение может быть информационным, предупреждающим или сообщением о критической ошибке. Каждому типу сообщения соответствует определенный значок. Тип сообщения задается именованной константой (табл. 2.13); кнопки — кнопки, отображаемые в окне сообщения. Задаются операцией включения в множество элементов — констант (табл. 2.14). контекстСправки — параметр, который определяет раздел справочной информации, который появится на экране, если пользователь нажмет клавишу <F1>. Если вывод справочной информации не предусмотрен, то значение параметра должно быть равно нулю.


Таблица 2.13. Константы, определяющие тип сообщения

Константа
Тип сообщения
Значок
mtWarning
Внимание

mtError
Ошибка

mtlnformation
Информация

mtConfirmation
Подтверждение

MtCustom
Обычное
Без значка


Таблица 2.14. Константы, определяющие кнопки в окне сообщения

Константа
Кнопка
Константа
Кнопка
mbYes
Yes
mbAbort
Abort
mbNo
No
mbRetry
Retry
mbOK
OK
mblgnore
Ignore
mbCancel
Cancel
mbAll
All
mbHelp
Help
   


Кроме приведенных констант можно использовать константы mbOkCancel, mbYesNoCancel и mbAbortRetryignore. Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации командных кнопок.

Значение, возвращаемое функцией MessageDig (табл. 2.15), позволяет определить, какая из командных кнопок была нажата пользователем.

Таблица 2.15. Значения функции MessageDlg

Значение функции MessageDlg
Диалог завершен нажатием кнопки
mr Abort
Abort
mrYes
Yes
mrOk
Ok
mrRetry
Retry
mrNo
No
mrCancel
Cancel
mrlgnore
Ignore
mrAll
All

Внесение изменений



После нескольких запусков программы "Сила тока" возникает желание усовершенствовать программу, внести в нее изменения. Например, такие, чтобы после ввода напряжения в результате нажатия клавиши <Enter> курсор переходил в поле Сопротивление, а после ввода сопротивления в результате нажатия этой же клавиши выполнялся расчет. Кроме того, было бы неплохо, чтобы пользователь мог вводить в поля редактирования только числа. Чтобы внести изменения в программу, нужно запустить C++ Builder и открыть соответствующий проект. Сделать это можно обычным способом, выбрав в меню File команду Open Project. Можно также воспользоваться командой Reopen из меню File. При выборе команды Reopen открывается список проектов, над которыми работал программист в последнее время. В листинге 2.4 приведена программа "Сила тока", в которую внесены изменения: добавлены функции обработки событий onKeyPress для компонентов Edit1 и Edit2. Чтобы добавить в программу функцию обработки события, надо в окне Object Inspector выбрать компонент, для которого нужно создать функцию обработки события, на вкладке Events выбрать событие и сделать двойной щелчок в поле рядом с именем события. C++ Builder сформирует шаблон функции обработки события. После этого можно вводить инструкции, реализующие функцию.

Листинг 2.4. Функции обработки событий на компонентах формы программы "Сила тока"

// щелчок на кнопке Вычислить
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// проверим, введены ли данные в поля Напряжение и Сопротивление
if ( ((Editl-XText).Length() == 0) || ((Edit2->Text).Length() ==0))
{
MessageDlg("Haдo ввести напряжение и сопротивление",
mtlnformation, TMsgDlgButtons() << mbOK, 0);
if ((Editl->Text).Length() == 0)
Edit1->SetFocus(); // курсор в поле Напряжение else
Edit2->SetFocus(); // курсор в поле Сопротивление return; };
// получить данные из полей ввода
u = StrToFloat(Editl->Text) ;
r = StrToFloat(Edit2->Text);
// вычислить силу тока try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2->SetFocus(); // курсор в поле Сопротивление
return;
}
// вывести результат в поле Label4
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + " А";
}
// нажатие клавиши в поле Напряжение
void __fastcall TForml::EditlKeyPress(TObject *Sender, char SKey)
{
// коды запрещенных клавиш заменим нулем, в результате
// символы этих клавиш в поле редактирования не появятся
// Key — код нажатой клавиши
// проверим, является ли символ допустимым
if ( ( Key >= '0') && ( Key <= '9'})
// цифра return;
// Глобальная переменная DecimalSeparator
// содержит символ, используемый в качестве разделителя
// при записи дробных чисел
if ( Key == DecimalSeparator)
{
if ( (Editl-XText).Pos(DecimalSeparator) != 0)
Key =0; // разделитель уже введен return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
{
Edit2->SetFocus() ;
return;
};
// остальные клавиши запрещены Key =0;
// не отображать символ
}
// нажатие клавиши в поле Сопротивление
void__fastcall TForml::Edit2KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( ( Key >= '0') && ( Key <= '9')) // цифра
return;
if ( Key == DecimalSeparator)
{
if ( (Edit2->Text).Pos(DecimalSeparator) != 0)
Key =0; // разделитель уже введен return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return; <
if ( Key == VK_RETORN) // клавиша <Enter>
(
Buttonl->SetFocus(); // переход к кнопке Вычислить
// повторное нажатие клавиши <Enter>
// активизирует процесс вычисления тока
return;
};
// остальные клавиши запрещены Key = 0; //не отображать символ
}
// щелчок на кнопке Завершить
void __fastcall TForml::Button2Click(TObject *Sender)
{
Forml->Close(); // закрыть форму приложения }


Настройка приложения



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


Название программы



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

Название программы надо ввести в поле Title (рис. 2.38) вкладки Application диалогового окна Project Options, которое появляется в результате выбора в меню Project команды Options.



Рис. 2.38. Название программы надо ввести в поле Title


Значок приложения



Чтобы назначить приложению значок, отличный от стандартного, нужно в меню Project выбрать команду Options и в открывшемся окне на вкладке Application щелкнуть на кнопке Load Icon. В результате этих действий откроется стандартное окно, используя которое можно просмотреть каталоги и найти подходящий значок (значки хранятся в файлах с расширением ico).

В состав C++ Builder входит утилита Image Editor (Редактор изображений), при помощи которой программист может создать для своего приложения уникальный значок. Запустить Image Editor можно из C++ Builder, выбрав в меню Tools команду Image Editor, или из Windows — командой Пуск | Программы | Borland C++ Builder | Image Editor.

Чтобы начать работу по созданию нового значка, нужно в меню File выбрать команду New | Icon File (рис. 2.39).



Рис. 2.39. Начало работы над новым значком


После выбора типа создаваемого файла открывается окно Icon Properties (рис. 2.40), в котором необходимо выбрать характеристики создаваемого значка: Size (Размер) — 32x32 (стандартный размер значков Windows) и Colors (Палитра) — 16 цветов. В результате нажатия кнопки ОК открывается окно Iconl.ico (рис. 2.41), в котором можно, используя стандартные инструменты и палитру, нарисовать нужный значок.



Рис. 2.40. Стандартные характеристики значка



Рис. 2.41. Начало работы над новым значком


Процесс рисования в Image Editor практически ничем не отличается от процесса создания картинки в обычном графическом редакторе, например в Microsoft Paint. Однако есть одна тонкость. Первоначально поле изображения закрашено "прозрачным" цветом. Если значок нарисовать на этом фоне, то при отображении значка части поля изображения, закрашенные "прозрачным" цветом, примут цвет фона, на котором будет находиться значок.

В процессе создания картинки можно удалить (стереть) ошибочно нарисованные элементы, закрасив их прозрачным цветом, которому на палитре соответствует левый квадрат в нижнем ряду (рис. 2.42).

Кроме "прозрачного" цвета в палитре есть "инверсный" цвет. Нарисованные этим цветом части рисунка при выводе на экран будут окрашены инверсным относительно цвета фона цветом.



Рис. 2.42. Палитра


Чтобы сохранить нарисованный значок, надо в меню File выбрать команду Save, в открывшемся диалоговом окне раскрыть папку проекта (приложения, для которого создан значок) и задать имя файла значка, которое обычно совпадает с именем проекта (выполняемого файла приложения).


Перенос приложения на другой компьютер



Небольшую программу, которая использует только стандартные компоненты и представляет собой один-единственный ехе-файл, можно перенести на другой компьютер вручную, например, при помощи дискеты. Как правило, при запуске таких программ на другом компьютере проблем не возникает. Вместе с тем, необходимо обратить внимание на следующее. Программа, созданная в C++ Builder, использует DLL версию библиотеки времени выполнения (RTL — Runtime Library) и специальные динамические библиотеки — пакеты (например, в пакете VCL60 находятся наиболее часто используемые компоненты и системные функции). Чтобы программа могла работать на другом компьютере, помимо ехе-файла на этот компьютер надо перенести RTL-библиотеку и используемые программой пакеты или включить библиотеку и пакеты в ехе-файл (что существенно увеличит размер ехе-файла). Чтобы включить в выполняемый файл RTL-библиотеку и используемые программой пакеты, надо в меню Project выбрать команду Options и во вкладках Linker (рис. 2.43) и Packages (рис. 2.44) сбросить соответственно флажки Use dynamic RTL и Build with runtime packages. После этого нужно выполнить перекомпоновку программы.

Сложные программы, например те, которые используют компоненты доступа к базам данных, перенести на другой компьютер вручную проблематично. Для таких программ лучше создать установочную дискету (CD-ROM). Сделать это можно, например, при помощи пакета InstallShield Express, который входит в комплект поставки C++ Builder.



Рис. 2.43. Чтобы включить в выполняемый файл RTL-библиотеку, сбросьте флажок Use dynamic RTL



Рис. 2.44. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packages


Структура простого проекта



Проект представляет собой набор программных единиц — модулей.

Один из модулей, называемый главным, содержит инструкции, с которых начинается выполнение программы. Чтобы увидеть главный модуль, нужно в меню Project выбрать команду View Source. В качестве примера в листинге 2.5 приведен текст главного модуля программы "Сила тока".

Листинг 2.5. Главный модуль (Amper.cpp)

#include <vcl.h>
#pragma hdrstop
USEFORM("Amper_l.cpp", Forml);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "Сила тока";
Application->CreateForm(__classid(TForml), SForml);
Application->Run(); }
catch (Exception Sexception)
{
Application->ShowException(Sexception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception Sexception)
{
Application->ShowException(Sexception);
 }
 }
return 0;
} 

Начинается главный модуль директивами компилятору (точнее, препроцессору). Директива #include <vci,h> информирует компилятор, что перед тем как приступить непосредственно к компиляции, в текст главного модуля нужно включить заголовочный файл библиотеки визуальных компонентов — vcl.h. Строка USEFORM("Amper_i.cpp", Form1) указывает, что в проект нужно включить файл модуля формы Amper_l.cpp, который содержит функции обработки событий для формы Form1. Далее следует описание главной функции программы — winMain. Функция winMain инициализирует внутренние структуры программы, создает форму Formi и запускает программу, что приводит к появлению на экране стартовой формы. Так как в проекте "Сила тока" только одна форма, то на экране именно она и появляется. Инструкция обработки исключений catch выполняется, если в программе возникает ошибка. Таким образом, главный модуль обеспечивает вывод стартовой формы программы, дальнейшее поведение которой определяют функции обработки событий стартовой формы.

Помимо главного модуля в состав проекта входят модули формы. Для каждой формы C++ Builder создает отдельный модуль, который состоит из двух файлов: заголовочного файла и файла кода (содержимое этих файлов отражается в окне редактора кода). Заголовочный файл содержит описание формы (листинг 2.6), файл кода (модуль формы) — описание (текст) функций, в том числе и обработки событий (листинг 2.7).

Листинг 2.6. Заголовочный файл модуля формы (Amper_1.h)
#ifndef Amper_1H
#define Amper_1H
#include <Classes.hpp>
#include «Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
class TForml : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TEdit *Editl;
TEdit *Edit2;
TButton *Buttonl;
TButton *Button2;
TLabel *Label4;
void__fastcall ButtonlClick(TObject *Sender);
void__fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForml(TComponent* Owner);
};
extern PACKAGE TForml *Form1;
#endif

Листинг 2.7. Модуль формы (Amper_1.cpp)
#include <vcl.h>
#pragma hdrstop
#include "Amper_l.h"
#ragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
}
// щелчок на кнопке Вычислить
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // сила тока
// получить данные из полей ввода
// возможно исключение
try
{
u = StrToFloat(Editl->Text);
r = StrToFloat(Edit2->Text);
}
catch (EConvertError &e)
{
ShowMessage("При вводе дробных чисел используйте запятую.");
return;
}
// вычислить силу тока
// возможно исключение
try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Сопротивление не должно быть равно нулю");
Edit1->SetFocus(); // курсор в поле Сопротивление
return;
 }
// вывести результат в поле метки Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,3);
}
// щелчок на кнопке Завершить
void__fastcall TForml::Button2Click(TObject *Sender)
{
Forml->Close(); // закрыть окно программы
} 

Следует отметить, что значительное количество работы по генерации программного кода выполнил C++ Builder. Он полностью сформировал главный модуль (Amper.cpp), заголовочный файл модуля формы (Amper_l.h), значительную часть модуля формы (Amper_l.cpp). Кроме того, C++ Builder, анализируя действия программиста, сформировал описание формы, файл проекта и файл ресурсов проекта.