Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Упражнения

1. Организовать пересылку текстовых сообщений между клиентом и сервером в обоих направлениях с постоянным отслеживанием информации.

2. Реализовать передачу координат курсора мыши между клиентом и сервером в обоих направлениях с постоянным отслеживанием координат.

3. Реализовать простейший “чат”.

4. Реализовать игру в “слова”, например по очереди называть названия городов.

5. Реализовать игру «крестики/нолики» в сети.

6. Реализовать игру «морской бой» в сети.

 

Процесс разработки собственного компонента (назовем его 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р.срр кода для регистрации компонентf 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;




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 700; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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