
Перед тем как сохранить файл ресурсов компонента, битовому образу надо присвоить имя. Имя должно совпадать с именем класса компонента. Чтобы задать имя битового образа, необходимо щелкнуть правой кнопкой мыши на имени битового образа (Bitmap!), выбрать в появившемся контекстном меню команду Rename и ввести новое имя.
Созданный файл ресурсов компонента нужно сохранить в том каталоге, в котором находится файл модуля компонента. Для этого надо из меню File выбрать команду Save.
На Рисунок 6.6 приведен вид окна Image Editor, в левой части которого содержится файл ресурсов компонента TNkEdit (nkedit.dcr), а в правой части — окно редактора битового образа, в котором находится изображение значка компонента. Обратите внимание, что имя файла ресурсов компонента (NkEdit.dcr) должно совпадать с именем модуля компонента (NkEdit.cpp), a имя битового образа (TNKEDIT) — с именем класса компонента (TNkEdit).

В поле Unit file name (Имя файла модуля) нужно ввести имя файла модуля. Для этого удобно воспользоваться кнопкой Browse.
Поле Search path (Путь поиска) должно содержать разделенные точкой с запятой имена каталогов, в которых C++ Builder во время установки компонента будет искать необходимые файлы, в частности файл ресурсов компонента. Если имя файла модуля было введено в поле Unit file name выбором файла из списка, полученного при помощи кнопки Browse, то C++ Builder автоматически добавляет в поле Search path имена необходимых каталогов. Следует обратить внимание на то, что файл ресурсов компонента должен находиться в одном из каталогов, перечисленных в поле Search path. Если его там нет, то компоненту будет назначен значок его родительского класса.
Поле Package file name должно содержать имя пакета, в который будет установлен компонент. По умолчанию компоненты, создаваемые программистом, добавляются в пакет dclusr.bpk.
Поле Package description содержит название пакета. Для пакета dclusr.bpk это текст: Borland User Components.
После того как поля будут заполнены, надо щелчком на кнопке ОК активизировать процесс установки. Сначала на экране появляется окно Confirm (Рисунок 6.8), в котором C++ Builder просит подтвердить обновление пакета.

Сначала в списке Pages необходимо выделить нужную вкладку палитры компонентов. Затем, если надо изменить порядок следования вкладок палитры компонентов, следует воспользоваться кнопками Move Up и Move Down и путем перемещения выбранного имени по списку Pages добиться нужного порядка следования вкладок.
Если надо изменить порядок следования значков компонентов на вкладке, то в списке Components следует выбрать нужный значок компонента и кнопками Move Up и Move Down переместить значок на новое место.
При необходимости изменить имя вкладки палитры следует в списке Pages выбрать имя нужной вкладки, нажать кнопку Rename и в поле Page name открывшегося диалогового окна Rename page (Рисунок 6.15) ввести новое имя.


Внешне форма разрабатываемого приложения почти ничем не отличается от формы приложения "Сила тока", рассмотренного в гл. 2. Однако если выбрать поле ввода, то в окне Object Inspector будет указано, что текущим компонентом является компонент класса TNkEdit, а в списке свойств можно будет увидеть свойства, которых нет у стандартного компонента Edit (Рисунок 6.13).

В листинге 6.5 приведен файл реализации приложения тестирования компонента NkEdit.

В поле Ancestor type надо ввести базовый тип создаваемого компонента. Для разрабатываемого компонента базовым компонентом является стандартный компонент Edit (поле ввода-редактирования). Поэтому базовым типом разрабатываемого компонента является тип TEdit.
В поле Class Name необходимо ввести имя класса разрабатываемого компонента (например, TNkEdit). Вспомните, что в C++ Builder принято соглашение, согласно которому имена типов должны начинаться буквой т. В поле Palette Page нужно ввести имя вкладки палитры компонентов, на которую будет помещен значок компонента. Название вкладки палитры компонентов можно выбрать из раскрывающегося списка. Если в поле Palette Page ввести имя еще не существующей вкладки палитры компонентов, то непосредственно перед добавлением компонента вкладка с указанным именем будет создана.
В поле Unit file name находится автоматически сформированное имя файла модуля создаваемого компонента. C++ Builder присваивает модулю компонента имя, которое совпадает с именем типа компонента, но без буквы т. Щелкнув на кнопке с тремя точками, можно выбрать каталог, в котором должен быть сохранен модуль компонента.
В результате щелчка на кнопке ОК будет сформирован модуль компонента, состоящий из двух файлов: файла заголовка (листинг 6.1) и файла реализации (листинг 6.2).

C++ Builder позволяет менять порядок следования вкладок в палитре компонентов, названия вкладок, а также порядок следования значков компонентов на вкладках. Настройка палитры компонентов выполняется в диалоговом окне Palette Properties, которое открывается выбором из меню Component команды Configure Palette (Рисунок 6.14).

На этом процесс установки компонента заканчивается. В результате на вкладке палитры компонентов, имя которой было задано при создании модуля компонента, появляется значок установленного компонента (Рисунок 6.11).
После того как компонент будет добавлен в пакет и его значок появится в палитре компонентов, необходимо проверить поведение компонента во время разработки приложения, использующего этот компонент (работоспособность компонента была проверена раньше, когда компонент добавлялся в форму приложения динамически, во время работы программы).
Можно считать, что компонент работает правильно, если во время разработки приложения удалось поместить этот компонент в форму разрабатываемого приложения и, используя окно Object Inspector, установить значения свойств компонента, причем как новых, так и унаследованных от родительского класса.
Работоспособность компонента NkEdit можно проверить, использовав его, например, в приложении "Сила тока", вид формы которого приведен на Рисунок 6.12.
Файл ресурсов компонента можно создать при помощи утилиты Image Editor, которую можно запустить из C++ Builder (команда Tools | Image Editor) или из Windows (команда Пуск | Программы | C++ Builder | Image Editor). Для того чтобы создать файл ресурсов компонента, нужно из меню File выбрать команду New и из появившегося списка выбрать тип создаваемого файла — Component Resource File (Рисунок 6.4).
В результате открывается окно файла ресурсов Untitledl.dcr, а в меню диалогового окна Image Editor появляется новый пункт — Resource. Теперь нужно из меню Resourse выбрать команду New/Bitmap и в открывшемся окне Bitmap Properties (Рисунок 6.5) установить характеристики битового образа значка компонента: Size — 24x24 пиксела, Colors — 16. В результате этих действий в создаваемый файл ресурсов компонента будет добавлен новый ресурс — битовый образ с именем Bitmap 1. Двойной щелчок на имени ресурса (Bitmap 1) раскрывает окно редактора битового образа, в котором можно нарисовать нужную картинку.
Изображение в окне графического редактора можно увеличить. Для этого необходимо выбрать команду Zoom In меню View.
Следует обратить внимание на то, что цвет правой нижней точки рисунка определяет "прозрачный" цвет. Элементы значка компонента, закрашенные этим цветом, на палитре компонентов C++ Builder не видны.

Тестируемый компонент создает и настраивает конструктор формы. Следует обратить внимание, что свойству Parent созданного компонента обязательно надо присвоить значение. Если этого не сделать, то компонент на форме не появится. Информацию о настройках созданного компонента выводит функция FormCreate. На Рисунок 6.3 приведен вид окна программы "Тест компонента NkEdit во время ее работы.

После установки компонента в пакет открывается диалоговое окно Package (Редактор пакета компонентов) (Рисунок 6.10), в котором перечислены компоненты, находящиеся в пакете.
Перед началом работы по созданию нового компонента нужно создать отдельный каталог для модуля и других файлов компонента. После этого можно приступить к созданию компонента.
Чтобы начать работу над новым компонентом, надо активизировать процесс создания нового приложения (команда File | New | Application), в меню Component выбрать команду New Component и в поля диалогового окна New Component (Рисунок 6.1) ввести информацию о создаваемом компоненте.
Перед тем как добавить новый компонент в палитру компонентов, необходимо всесторонне его проверить. Для этого надо создать приложение, использующее компонент, и убедиться, что компонент работает так, как надо.
Во время создания формы приложения нельзя добавить в форму компонент, значка которого нет в палитре компонентов. Однако такой компонент может быть добавлен в форму динамически, т. е. во время работы приложения.
Наиболее просто выполнить тестирование компонента можно следующим образом. Сначала надо активизировать процесс создания нового приложения, а затем создать форму (добавить и настроить необходимые компоненты) и сохранить приложение в том каталоге, в котором находятся файлы тестируемого компонента.
Вид формы приложения тестирования компонента NkEdit приведен на Рисунок 6.2Д
Форма содержит две метки. Первая метка обеспечивает вывод общей информации о компоненте; вторая метка (на рисунке она выделена) используется для вывода информации о настройке компонента. Самого компонента NkEdit в форме нет. Он будет создан во время работы программы, в момент ее запуска.
После того как форма тестового приложения будет создана, в модуль приложения надо внести дополнения, приведенные ниже.
1. В текст файла реализации (срр-файл) включить следующую директиву #include "nkedit.cpp".
2. Объявить компонент NkEdit (оператор TNkEdit *NkEdit). Здесь следует вспомнить, что компонент является объектом (точнее ссылкой на объект), поэтому объявление компонента не обеспечивает создание компонента, а только создает указатель на компонент.
3. Для формы приложения создать процедуру обработки события oncreate, которая путем вызова конструктора тестируемого компонента создаст компонент и выполнит его настройку (присвоит значения свойствам компонента).
После того как будет создан файл ресурсов компонента, можно приступить к установке компонента в пакет компонентов. Компонент можно установить в существующий пакет или создать новый пакет и затем установить в него компонент.
Чтобы установить компонент в существующий пакет, надо из меню Component выбрать команду Install Component и заполнить поля вкладки Into existing package диалогового окна Install Component (Рисунок 6.7).
Для того чтобы значок компонента появился в палитре компонентов, компонент должен быть добавлен в один из пакетов (Packages) компонентов C++ Builder. Пакет компонентов — это специальная библиотека (файл с расширением bpk). Например, для компонентов, созданных программистом, предназначен пакет dclusr.bpk.
В процессе добавления компонента в пакет C++ Builder использует файл ресурсов компонента, в котором должен находиться битовый образ значка компонента. Имя файла ресурсов компонента должно совпадать с именем файла модуля компонента. Файл ресурсов имеет расширение dcr (Dynamic Component Resource). Битовый образ, находящийся внутри файла ресурсов, должен иметь имя, совпадающее с именем класса компонента.
Приступая к разработке нового компонента, следует четко сформулировать назначение компонента. Затем необходимо определить, какой из компонентов C++ Builder наиболее близок по своему назначению, виду и функциональным возможностям к компоненту, который разрабатывается. Именно этот компонент следует выбрать в качестве базового.

После щелчка на кнопке Yes процесс установки продолжается. Если он завершается успешно, то на экране появляется информационное сообщение (Рисунок 6.9) о том, что пакет обновлен, а компонент зарегистрирован.

В листинге 6.6 приведен модуль приложения "Сила тока". Здесь надо обратить внимание на следующее. Первое. В программе нет кода, обеспечивающего фильтрацию символов, вводимых в поле редактирования. Тем не менее во время работы программы пользователь может ввести в поле редактирования только положительное число. Второе. В программе не используется функция strToFloat. Число, которое соответствует введенной в поле редактирования строки символов, получается путем обращения к свойству Numb.
Очевидно, что использование в программе компонента NkEdit вместо стандартного Edit освобождает программиста от рутины, сокращает размер кода и делает его более понятным.

