![]() |
||
---|---|---|
Компонент программиста
C++ Builder позволяет программисту создать свой собственный компонент, поместить его на одну из вкладок палитры компонентов и использовать при разработке приложений точно так же, как и другие компоненты C++ Builder. Наиболее просто создать компонент программиста можно на базе существующего (базового) компонента путем расширения или ограничения возможностей базового компонента. Например, компонент, обеспечивающий ввод и редактирование числа, логично создать на основе компонента, обеспечивающего ввод строки символов. Процесс создания компонента может быть представлен как последовательность следующих этапов: 1. Выбор базового класса. 2. Создание модуля компонента. 3. Тестирование компонента. 4. Добавление компонента в пакет компонентов. Рассмотрим процесс создания компонента программиста на примере. Создадим компонент NkEdit, который обеспечивает ввод и редактирование целого или дробного числа. Компонент также должен контролировать вводимое значение на принадлежность заданному диапазону. Тип числа и границы диапазона должны задаваться во время разработки формы приложения, использующего компонент. Приступая к разработке нового компонента, следует четко сформулировать назначение компонента. Затем необходимо определить, какой из компонентов C++ Builder наиболее близок по своему назначению, виду и функциональным возможностям к компоненту, который разрабатывается. Именно этот компонент следует выбрать в качестве базового. Перед началом работы по созданию нового компонента нужно создать отдельный каталог для модуля и других файлов компонента. После этого можно приступить к созданию компонента. Чтобы начать работу над новым компонентом, надо активизировать процесс создания нового приложения (команда File | New | Application), в меню Component выбрать команду New Component и в поля диалогового окна New Component ( 1) ввести информацию о создаваемом компоненте. В поле Ancestor type надо ввести базовый тип создаваемого компонента. Для разрабатываемого компонента базовым компонентом является стандартный компонент Edit (поле ввода-редактирования). Поэтому базовым типом разрабатываемого компонента является тип TEdit. В поле Class Name необходимо ввести имя класса разрабатываемого компонента (например, TNkEdit). Вспомните, что в C++ Builder принято соглашение, согласно которому имена типов должны начинаться буквой т. В поле Palette Page нужно ввести имя вкладки палитры компонентов, на которую будет помещен значок компонента. Название вкладки палитры компонентов можно выбрать из раскрывающегося списка. Если в поле Palette Page ввести имя еще не существующей вкладки палитры компонентов, то непосредственно перед добавлением компонента вкладка с указанным именем будет создана. В поле Unit file name находится автоматически сформированное имя файла модуля создаваемого компонента. C++ Builder присваивает модулю компонента имя, которое совпадает с именем типа компонента, но без буквы т. Щелкнув на кнопке с тремя точками, можно выбрать каталог, в котором должен быть сохранен модуль компонента. В результате щелчка на кнопке ОК будет сформирован модуль компонента, состоящий из двух файлов: файла заголовка (листинг 6.1) и файла реализации (листинг 6.2). Листинг 6.1. Файл NkEdit.h
#include <Classes.hpp>
#include <StdCtrls.hpp> Листинг 6.2. Файл NkEdit.cpp В файле заголовка NkEdit.h находится объявление нового класса. В файл реализации NkEdit.cpp помещена функция Register, которая обеспечивает регистрацию, установку значка компонента на указанную вкладку палитры компонентов. В сформированный C++ Builder шаблон компонента нужно внести дополнения: объявить поля данных, функции доступа к полям данных, свойства и методы. Если на некоторые события компонент должен реагировать не так, как базовый, то в объявление класса нужно поместить объявления соответствующих функций обработки событий. В листингах 6.3 и 6.4 приведены файлы заголовка и реализации компонента NkEdit после внесения всех необходимых изменений. Листинг 6.3. nkedit.h Листинг 6.4. nkedit.cpp В объявлении класса TNkEdit добавлены объявления полей FEnabiedFloat, FMin и FMax. Имена полей, согласно принятому в C++ Builder соглашению, 'начинаются с буквы F (от Field, поле). Поле FEnabledFioat хранит признак возможности ввода в поле редактирования дробного числа. Поля FMin и FMax хранят границы диапазона. Доступ к полям обеспечивают соответствующие свойства: EnabiedFloat, Min и мах. Так как объявления этих свойств находятся в секции published, то они будут доступны в окне Object Inspector. Свойство Numb, представляющее собой число, которое находится в поле редактирования, объявлено в секции public, поэтому оно доступно только во время работы программы. Здесь следует обратить внимание на то, что у свойства Numb нет соответствующего поля. Значение этого свойства вычисляется во время работы программы путем преобразования в число значения свойства Text базового компонента. Свойства Min и мах получают доступ к полям данных для чтения напрямую, для записи — посредством функций SetMin и SetMax. Свойство EnabдedFдoat получает доступ к полю FEnabledFloat для чтения и записи напрямую. Так как компонент NkEdit должен обеспечить фильтрацию символов (в поле редактирования должны отображаться только цифры и, в случае, если значение свойства EnabiedFloat равно true, десятичный разделитель), то в объявление класса добавлено объявление функции KeyPress, которая предназначена для обработки соответствующего события. Реакцию компонента NkEdit на нажатие клавиши клавиатуры определяет функция TNkEdit::KeyPress. В качестве параметра эта функция получает код нажатой клавиши. Перед вызовом функции TEdit: :KeyPress, которая обеспечивает обработку события Keypress базовым компонентом, код нажатой клавиши проверяется на допустимость. Если нажата недопустимая клавиша, то код символа заменяется на ноль. Допустимыми для компонента NkEdit, в зависимости от его настройки, являются цифровые клавиши, разделитель целой и дробной частей числа (в зависимости от настройки Windows, точка или запятая), "минус" и клавиша <Backspase>. Здесь следует вспомнить, что в тексте программы дробная часть числовой константы отделяется от целой части точкой. Во время работы программы при вводе исходных данных пользователь должен использовать тот символ, который задан в настройке Windows. В качестве разделителя обычно используют запятую (стандартная для России настройка) или точку. Приведенная процедура обработки события onKeypress учитывает, что настройка Windows может меняться, и поэтому введенный пользователем символ сравнивается не с константой, а со значением глобальной переменной Decimalseparator, которая содержит символ-разделитель, используемый в Windows в данный момент. Перед тем как добавить новый компонент в палитру компонентов, необходимо всесторонне его проверить. Для этого надо создать приложение, использующее компонент, и убедиться, что компонент работает так, как надо. Во время создания формы приложения нельзя добавить в форму компонент, значка которого нет в палитре компонентов. Однако такой компонент может быть добавлен в форму динамически, т. е. во время работы приложения. Наиболее просто выполнить тестирование компонента можно следующим образом. Сначала надо активизировать процесс создания нового приложения, а затем создать форму (добавить и настроить необходимые компоненты) и сохранить приложение в том каталоге, в котором находятся файлы тестируемого компонента. Вид формы приложения тестирования компонента NkEdit приведен на 2Д Форма содержит две метки. Первая метка обеспечивает вывод общей информации о компоненте; вторая метка (на рисунке она выделена) используется для вывода информации о настройке компонента. Самого компонента NkEdit в форме нет. Он будет создан во время работы программы, в момент ее запуска. После того как форма тестового приложения будет создана, в модуль приложения надо внести дополнения, приведенные ниже. 1. В текст файла реализации (срр-файл) включить следующую директиву #include "nkedit.cpp". 2. Объявить компонент NkEdit (оператор TNkEdit *NkEdit). Здесь следует вспомнить, что компонент является объектом (точнее ссылкой на объект), поэтому объявление компонента не обеспечивает создание компонента, а только создает указатель на компонент. 3. Для формы приложения создать процедуру обработки события oncreate, которая путем вызова конструктора тестируемого компонента создаст компонент и выполнит его настройку (присвоит значения свойствам компонента). В листинге 6.5 приведен файл реализации приложения тестирования компонента NkEdit. Листинг 6.5. Тест компонента NkEdit Тестируемый компонент создает и настраивает конструктор формы. Следует обратить внимание, что свойству Parent созданного компонента обязательно надо присвоить значение. Если этого не сделать, то компонент на форме не появится. Информацию о настройках созданного компонента выводит функция FormCreate. На 3 приведен вид окна программы "Тест компонента NkEdit во время ее работы. Для того чтобы значок компонента появился в палитре компонентов, компонент должен быть добавлен в один из пакетов (Packages) компонентов C++ Builder. Пакет компонентов — это специальная библиотека (файл с расширением bpk). Например, для компонентов, созданных программистом, предназначен пакет dclusr.bpk. В процессе добавления компонента в пакет C++ Builder использует файл ресурсов компонента, в котором должен находиться битовый образ значка компонента. Имя файла ресурсов компонента должно совпадать с именем файла модуля компонента. Файл ресурсов имеет расширение dcr (Dynamic Component Resource). Битовый образ, находящийся внутри файла ресурсов, должен иметь имя, совпадающее с именем класса компонента. Файл ресурсов компонента можно создать при помощи утилиты Image Editor, которую можно запустить из C++ Builder (команда Tools | Image Editor) или из Windows (команда Пуск | Программы | C++ Builder | Image Editor). Для того чтобы создать файл ресурсов компонента, нужно из меню File выбрать команду New и из появившегося списка выбрать тип создаваемого файла — Component Resource File ( 4). В результате открывается окно файла ресурсов Untitledl.dcr, а в меню диалогового окна Image Editor появляется новый пункт — Resource. Теперь нужно из меню Resourse выбрать команду New/Bitmap и в открывшемся окне Bitmap Properties ( 5) установить характеристики битового образа значка компонента: Size — 24x24 пиксела, Colors — 16. В результате этих действий в создаваемый файл ресурсов компонента будет добавлен новый ресурс — битовый образ с именем Bitmap 1. Двойной щелчок на имени ресурса (Bitmap 1) раскрывает окно редактора битового образа, в котором можно нарисовать нужную картинку. Изображение в окне графического редактора можно увеличить. Для этого необходимо выбрать команду Zoom In меню View. Следует обратить внимание на то, что цвет правой нижней точки рисунка определяет "прозрачный" цвет. Элементы значка компонента, закрашенные этим цветом, на палитре компонентов C++ Builder не видны. Перед тем как сохранить файл ресурсов компонента, битовому образу надо присвоить имя. Имя должно совпадать с именем класса компонента. Чтобы задать имя битового образа, необходимо щелкнуть правой кнопкой мыши на имени битового образа (Bitmap!), выбрать в появившемся контекстном меню команду Rename и ввести новое имя. Созданный файл ресурсов компонента нужно сохранить в том каталоге, в котором находится файл модуля компонента. Для этого надо из меню File выбрать команду Save. На 6 приведен вид окна Image Editor, в левой части которого содержится файл ресурсов компонента TNkEdit (nkedit.dcr), а в правой части — окно редактора битового образа, в котором находится изображение значка компонента. Обратите внимание, что имя файла ресурсов компонента (NkEdit.dcr) должно совпадать с именем модуля компонента (NkEdit.cpp), a имя битового образа (TNKEDIT) — с именем класса компонента (TNkEdit). После того как будет создан файл ресурсов компонента, можно приступить к установке компонента в пакет компонентов. Компонент можно установить в существующий пакет или создать новый пакет и затем установить в него компонент. Чтобы установить компонент в существующий пакет, надо из меню Component выбрать команду Install Component и заполнить поля вкладки Into existing package диалогового окна Install Component ( 7). В поле 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 ( 8), в котором C++ Builder просит подтвердить обновление пакета. После щелчка на кнопке Yes процесс установки продолжается. Если он завершается успешно, то на экране появляется информационное сообщение ( 9) о том, что пакет обновлен, а компонент зарегистрирован. После установки компонента в пакет открывается диалоговое окно Package (Редактор пакета компонентов) ( 10), в котором перечислены компоненты, находящиеся в пакете. На этом процесс установки компонента заканчивается. В результате на вкладке палитры компонентов, имя которой было задано при создании модуля компонента, появляется значок установленного компонента ( 11). Настройка палитры компонентов C++ Builder позволяет менять порядок следования вкладок в палитре компонентов, названия вкладок, а также порядок следования значков компонентов на вкладках. Настройка палитры компонентов выполняется в диалоговом окне Palette Properties, которое открывается выбором из меню Component команды Configure Palette ( 14). Сначала в списке Pages необходимо выделить нужную вкладку палитры компонентов. Затем, если надо изменить порядок следования вкладок палитры компонентов, следует воспользоваться кнопками Move Up и Move Down и путем перемещения выбранного имени по списку Pages добиться нужного порядка следования вкладок. Если надо изменить порядок следования значков компонентов на вкладке, то в списке Components следует выбрать нужный значок компонента и кнопками Move Up и Move Down переместить значок на новое место. При необходимости изменить имя вкладки палитры следует в списке Pages выбрать имя нужной вкладки, нажать кнопку Rename и в поле Page name открывшегося диалогового окна Rename page ( 15) ввести новое имя.
|
||
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. |