русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Создание собственных компонентов


Дата добавления: 2015-06-12; просмотров: 1346; Нарушение авторских прав


Процесс разработки собственного компонента (назовем его TMyComp) состоит из следующих этапов.

1. Создание модуля для нового компонента.

2. Наследование производным классом для нового компонента уже существующего базового класса библиотеки VCL.

3. Добавление нужных свойств, событий и методов.

4. Регистрация компонента в среде C++Builder.

5. Отладка.

6. Инсталляция компонента на Палитру компонентов.

7. Сохранение файлов компонента.

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

7.1. Создание модуля компонента

Программный модуль компонента состоит из двух файлов МуСоmр.срр и MyComp.h, которые компилируются в объектный файл MyComp.obj. При paзработке компонента либо создают новый модуль, либо модифицируют существующий. Чтобы создать модуль, необходимо выполнить командуFile|New и в открывшемся диалоговом окне New Items выбрать значок Unit. Чтобы добавить компонент к существующему модулю, нужно выполнить командуFile|Open и в открывшемся диалоговом окне выбрать файл имя_модуля.cpp для модуля, в который будет добавлен компонент. Далее формируется заготовка файла МуСоmр.h:

#ifndef MyCompH

#define MyCompH

#include <SysUtils.hpp>

#include <Classes.hpp>

#include <Controls.hpp>

#include <ExtCtrls.hpp>

//class TMyComponent: public< базовый компонентный класс >

class PACKAGE TMyComponent: public< базовый класс >

{

public:

__fastcall TMyComponent(TСomponent *Owner);



};

#endif

Объявление нового класса компонента должно включать макрос PACKAGE. Функционально сходные компоненты группируются в пакеты – динамические библиотечные файлы с расширением .bpl. Как и обычные dll-библиотеки, пакеты содержат код, разделяемый многими приложениями. Пакетная организация ускоряет компиляцию и сборку приложений, позволяет получить более эффективные исполняемые коды за счет того, что библиотека VCL не загружается целиком в процессе выполнения программы.

Созданный компонент пока не отличается от своего родителя.

7.2. Наследование компонента

Любой компонент является производным от базового класса TComponent и его наследников (таких как TControl или TGraphicControl) или от существующего компонентного класса.

Простейший способ построить новый компонент – это изменить свойства существующего компонента. Для этого можно использовать любой абстрактный класс VCL, в название которого входит слово Custom. Например, можно создать новый компонент списка со специальными свойствами, которых нет в стандартном классе TListBox. Поскольку нельзя непосредственно модифицировать TListBox, то можно начать с его ближайшего предшественника в иерархии классов. Для этой цели подходит класс TCustomListBox, который реализует все имеющиеся свойства производных компонентов списка, однако не выставляет всех их в секции_published.Наследуя компонент, нужно объявить в разделе _published те свойства, которые требуется включить в создаваемый компонент.

Все оконные компоненты являются производными от базового класса TWinControl. Стандартный элемент оконного управления характеризует так называемый «оконный дескриптор» (window handle), который заключен в свойстве Handle. Благодаря дескриптору Windows идентифицирует данный компонент, в частности он может принять фокус ввода. Хотя можно создать оригинальный оконный интерфейсный элемент (который не имеет существующих аналогов и никак не связан с ними), используя в качестве базового класса TwinControl. C++Builder предоставляет класс TCustomControl – специализированный оконный элемент управления, который упрощает рисование сложных визуальных изображений. Все компоненты стандартного оконного управления: кнопки, списки, текстовые поля (за исключением компонента TLabel, который никогда не принимает фокус ввода) – являются косвенными производными TWinControl.

В отличие от оконных компонентов, производных от класса TCustomControl, графические компоненты лишены оконного дескриптора и не могут принять фокус ввода. Они обеспечивают отображение объектов без использования системных ресурсов.

Новые графические компоненты необходимо наследовать от базового абстрактного класса TGraphicControl (потомка TControl). Класс TGraphicControl предоставляет канву для рисования и обрабатывает сообщения WM_PAINT. Все, что нужно сделать, это переопределить метод рисования Paint в соответствии с заданными требованиями.

Все компоненты имеют общий абстрактный базовый класс TСomponent, однако только невидимые компоненты можно наследовать непосредственно от класса TComponent. Невидимые компоненты исполь-зуются в качестве интерфейсных элементов с другими компонентами (доступ к базам данных или диалоговым окнам).

7.3. Добавление свойств, событий и методов

Свойства, в отличие от данных-членов, сами не хранят данные, однако методы чтения и записи организуют к ним доступ. Об этом необходимо помнить при создании или изменении компонентных свойств.

Событие – это связь между некоторым воздействием на компонент и кодом обработчика события, который реагирует на это воздействие. Обработчик события пишется прикладным программистом. Используя события, программист может приспособить поведение компонента к своим требованиям без необходимости изменения самих объектов. События, возникающие в результате типичных действий пользователя (например, движений мышью) встроены во все стандартные компоненты VCL, однако можно определить и новые события. C++Builder реализует события как свойства.

7.4. Регистрация компонента

Регистрация компонента – это процесс, который информирует C++Builder о том, какой компонент добавляется к VCL и на какой вкладке Палитры компонентов он должен появиться. Для регистрации компонента выполняются следующие действия.

1. Добавляется функция Register() в файле МуСоmр.срр. При этом функция заключается в пространство имен с именем, совпадающим с именем модуля компонента (при этом первая буква должна быть заглавной, а все остальные – строчными).

2. В теле функции Register объявляется массив типа TComponentClass, в который вводится имя класса регистрируемого компонента.

3. В теле функции Register вызывается функция RegisterComponents с тремя параметрами: названием вкладки Палитры компонентов, массивом компонентных классов и индексом последнего класса в этом массиве.

Например:

namespace Mycomp {

void __fastcall PACKAGE Register()

{

TComponentClass classes[1] = {_classid(TMyComponent)};

RegisterComponents("Samples", classes, 0);}

}

Листинг представляет собой включение в файл МуСоmр.срр кода для регистрации компонента TMyComponent на вкладкеSamples Палитры компонентов.

Когда компонент зарегистрирован, можно его испытать и инсталлировать на Палитру компонентов.

7.5. Отладка неинсталлированного компонента

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

1. Включить файл модуля MyComp.h компонента в заголовочный файл некоторой формы: #include " MyComp.h "

2. Добавить объектный член данных, представляющий испытываемый компонент, в раздел объявлений public класса формы: TMyComponent *MyComponent1;

3. Подсоединить обработчик к событию OnCreate формы.

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

5. Сразу же за вызовом конструктора установить свойство Parent – родителя компонента. Обычно значением этого свойства является указатель this. Если компонент не является элементом управления, т. е. не наследовался от TControl, то этот шаг пропускается.

6. Инициировать значения других свойств компонента.

Ниже приводится листинг модуля формы, используемой для отладки компонента

// Заголовочный файл TestForm.h

#ifndef TestFormH

#define TestFormH

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include "MyComp.h" // 1

class TForm1 : public TForm {

__published:

private:

public:

TMyComponent * MyComponent1; // 2

__fastcall TForm1 (TComponent* Owner); // 3

};

extern PACKAGE TForm1 *Forml;

#endif

 

// Файл TestForm.cpp модуля формы

#include <vcl.h>

#pragma hdrstop

#include "TestForm.h"

#pragma package(smart_init)

pragma resource "*.dfm"

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)

{

MyComponent1= new TMyComponent(this); // 4

MyComponent1->Parent = this; // 5

MyComponentl->Left = 12; // 6

}

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

7.6. Инсталляция компонента на Палитру компонентов

Чтобы добавить к VCL компонент, необходимо выполнить следующие шаги.

1. С помощью командыComponent|Install Componentоткрывается диалоговое окно инсталляции компонентов. Можно выбрать вкладку Into New Package, если компонент включается в новый пакет, или вкладку Into existing package, если используется существующий пакет.

2. Вводится имя модуля компонента MyComp.cpp и путь к нему в поле Unit file name. Далее вводится имя нового пакета (совпадающее с названием вкладки Палитры компонентов, на которую устанавливается новый компонент) в поле Package file name, а его краткое описание – в поле Package description. Щелчок на кнопке OK закрывает диалоговое окно установки. Добавление компонента в существующий пакет выполняется аналогично.

3. С текущим содержимым пакета можно ознакомиться в открывшемся окне Менеджера пакетов. Все файлы, составляющие рассматриваемый пакет, будут созданы (или перестроены), и новый компонент установлен на ту вкладку Палитры компонентов, которая была задана в качестве одного из параметров функции регистрации Register. C++Builder автоматически включает в проект системные файлы периода выполнения (с расширениями .bpi, .res), необходимые для сборки пакета.

4. Выбирается команда Install в Менеджере пакетов. В результате выполняется компиляция, перестройка VCL и установка нового компонента на Палитру компонентов.

5. Командой Component|Install Packages или Project|Options открывается список установленных пакетов. По щелчку на кнопке Components можно увидеть список всех компонентов, включенных в выбранный пакет. Если нужно, чтобы текущая конфигурация пакетов принималась по умолчанию в каждом новом создаваемом проекте, то необходимо установить флажок Default.

Чтобы удалить компонент из VCL, необходимо выполнить следующие действия.

1. Выполнить командуComponent|Install Component, которая открывает диалоговое окно установки компонентов.

2. Найти удаляемый компонентный класс в списке Component classes выбранной группы Библиотеки и нажать кнопкуRemove.

3. Нажать кнопку ОК. Библиотека будет перестроена и компонент удален из Палитры компонентов.

Чтобы перестроить Палитру компонентов, необходимо выполнить следующие действия.

1. Открыть диалог установки опций Палитры компонентов с помощью команд Component|Configure Palette илиOptions|Environment|Palette.

2. Нажать кнопкуAdd и выбрать имя для новой вкладки. Имя добавленной вкладки появится внизу списка Pages названий вкладок.

3. Перетащить мышью выбранный компонент в списке Components на нужную вкладку списка Pages.

4. Нажать кнопку ОК. Библиотека и Палитра компонентов будут перестроены.

7.7. Сохранение файлов нового компонента

После окончания процесса разработки компонент будет представлен следующими файлами:

объектный файл результата компиляции MyComp.obj;

файлы модуля компонента (MyComp.h, MyComp.cpp);

файлы пакета с именем имя_пакета и расширениями bpl, bpk, lib, bpi, cpp, res;

файл пиктограммы компонента для Палитры компонентов MyComp.dcr;

файл формы MyComp.dfm, если компонент использует форму;

контекстно-справочный файл MyComp.hlp.

По умолчанию C++Builder сохраняет компонентный пакетный файл с расширением bpl в каталоге \...\ProgramFiles\Borland\CBuilder6\ Projects\Bpl, а библиотечные файлы с расширениями lib и bpi – в каталоге \...\ProgramFiles\Borland\CBuilder6\Projects\Lib. Используя новый компонент в дальнейшем, нельзя забывать проверять вкладку Directories|Conditionals диалогового окна команды Project|Options, где должен быть указан путь к библиотечным каталогам.

Пример разработки простого компонента

Перед тем, как приступить к разработке компонента, необходимо знать, что он должен делать и как будет реализовано его оригинальное поведение. Рассмотрим пример компонента, моделирующего бинарный индикатор, который меняет цвет при изменении состояния. Некоторое свойство компонента будет хранить его текущее состояние (true – индикатор включен, и false – в противном случае). Для наследования желательно выбрать наиболее близкий в иерархии VCL базовый компонентный класс. Очевидно, что индикатор представляет собой графический компонент семейства TGraphicControl. Поскольку разрабатывается простой компонент, пусть, к примеру, он будет иметь форму круга, а не более сложный вид. Компонент TShape из вкладки Палитры компонентов Additional выглядит ближайшим родственным компонентом. При внимательном рассмотрении TShape видно, что он имеет больше свойств и событий, чем нам требуется. Все что мы хотим изменить при наследовании от TShape – это форму индикатора и цвет кисти при его переключении. Перейдем к фактической разработке компонента:

Создание формы тестового приложения.

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

а) с помощью командыFile|NewApplication создайте пустую форму;

б) разместите кнопку TButton на форме;

в) с помощью командыFile|SaveAll сохраните форму и проект приложения в файлах под именами MyCompForm.cpp и MyCompProj.bpr.



<== предыдущая лекция | следующая лекция ==>
Работа с базами данных | Члены данных, свойства и методы.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.211 сек.