
- •Белорусский государственный университет механико-математический факультет
- •2006 Г., протокол № 3
- •Введение
- •2. Компоненты библиотеки vcl
- •Упражнения
- •4. Поддержка графики и графические компоненты
- •5. Работа с базами данных
- •Упражнения
- •7. Создание собственных компонентов
- •8. Пример разработки простого компонента
- •1. Создание формы тестового приложения.
- •2. Создание модуля компонента.
- •3. Члены данных, свойства и методы.
- •4. Испытание компонента.
- •5. Инсталляция компонента.
- •6. Проверка работы.
- •Содержание
- •Пособие по курсу «методы программирования» для студентов специальностей
- •220030, Минск, проспект Независимости, 4.
- •220030, Минск, ул. Красноармейская, 6.
8. Пример разработки простого компонента
Перед тем, как приступить к разработке компонента, необходимо знать, что он должен делать и как будет реализовано его оригинальное поведение. Рассмотрим пример компонента, моделирующего бинарный индикатор, который меняет цвет при изменении состояния. Некоторое свойство компонента будет хранить его текущее состояние (true – индикатор включен, и false – в противном случае). Для наследования желательно выбрать наиболее близкий в иерархии VCL базовый компонентный класс. Очевидно, что индикатор представляет собой графический компонент семейства TGraphicControl. Поскольку разрабатывается простой компонент, пусть, к примеру, он будет иметь форму круга, а не более сложный вид. Компонент TShape из вкладки Палитры компонентов Additional выглядит ближайшим родственным компонентом. При внимательном рассмотрении TShape видно, что он имеет больше свойств и событий, чем нам требуется. Все что мы хотим изменить при наследовании от TShape – это форму индикатора и цвет кисти при его переключении. Перейдем к фактической разработке компонента:
1. Создание формы тестового приложения.
Пока мы не убедились, что разрабатываемый компонент работает, его нельзя включать в VCL. Сначала следует создать тестовое приложение для формы с прототипом нового компонента MyComp:
а) с помощью команды File|New Application создайте пустую форму;
б) разместите кнопку TButton на форме;
в) с помощью команды File|Save All сохраните форму и проект приложения в файлах под именами MyCompForm.cpp и MyCompProj.bpr.
2. Создание модуля компонента.
Мастер компонентов (Component Wizard) упрощает начальные шаги создания компонента:
а) выполните команду Component|New и в открывшемся диалоговом окне Мастера компонентов заполните поля диалога указанными на рис. 26 значениями. Нажмите кнопку ОК;
б) с помощью команды File|Save As сохраните файл Unitl.cpp под именем MyComp.cpp.
Файл MyComp.cpp будет содержать пустой конструктор объекта и функцию Register для регистрации компонента. Созданный при этом файл MyComp.h будет содержать объявление нового компонентного класса с конструктором, а также несколько заголовочных файлов предкомпиляции.
3. Члены данных, свойства и методы.
Прежде всего в файле MyComp.h опишем булеву переменную состояния индикатора и две переменные перечисляемого типа TColor для хранения цветов, отображающих оба состояния. Члены данных следует поместить в разделе private объявлений класса. Там же расположим прототипы методов записи соответствующих свойств, а сами свойства объявим в разделе _published.
Рис. 26. Окно Мастера компонентов
Ниже приводится заголовочный файл модуля компонента:
// MyComp.h ------------------------------------------------------------
#ifndef MyCompH
#define MyCompH
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE MyComp : public TShape
{
private:
bool FOnOff;
TColor FOnColor;
TColor FOffColor;
void __fastcall SetOnOff(const bool Value);
void __fastcall SetOnColor(const TColor OnColor);
void __fastcall SetOffColor (const TColor OffColor);
protected:
public:
__fastcall MyComp(TComponent* Owner);
__published:
__property bool OnOff= { read= FOnOff,write= SetOnOff};
__property ТСоlог OnColor= { read=FOnColor,write=SetOnColor};
__property TColor OffColor={ read=FOff Color, write= SetOffColor};
};
//---------------------------------------------------------------------------
#endif
Для добавления в файл MyComp.cpp необходимо написать три функции для присваивания значений свойств соответствующим членам данных и наполнить конструктор компонента инструкциями для инициализации переменных. Ниже приводится листинг файла MyComp.cpp после внесения изменений:
//MyComp.cpp
#include <vcl.h>
#pragma hdrstop
#include "MyComp.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created
// do not have any pure virtual functions.
static inline void ValidCtrCheck(MyComp *)
{ new MyComp(NULL); }
void __fastcall MyComp::SetOnOff(const bool Value) {
FOnOff = Value;
Brush->Color= (FOnOff) ? FOnColor : FOffColor;
}
void __fastcall MyComp::SetOnColor(const TColor OnColor) {
FOnColor = OnColor;
Brush->Color = (FOnOff) ? FOnColor : FOffColor;
}
void __fastcall MyComp::SetOffColor(const TColor OffColor) {
FOffColor = OffColor;
Brush->Color = (FOnOff) ? FOnColor : FOffColor;
}
//---------------------------------------------------------------------------
__fastcall MyComp::MyComp(TComponent* Owner)
: TShape(Owner)
{ Width = 15; //ширина по умолчанию
Height = 15; // высота по умолчанию
FOnColor = clLime; // зеленый, когда включен
FOffColor = clRed; // красный, когда выключен
FOnOff = false; // выключен по умолчанию
Shape = stEllipse; //в форме эллипса по умолчанию
Pen->Color = clBlack; // черный контур по умолчанию
Pen->Width = 2; // ширина контура по умолчанию
Brush->Color = FOffColor; // цвет заливки по умолчанию
}
namespace Mycomp
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(MyComp)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
Установленные конструктором значения членов данных по умолчанию появятся в окне Инспектора объектов при создании объекта. Действительно, при помещении компонента на форму конструктор вызывается автоматически. В результате появляется возможность менять значения свойств компонента не только во время выполнения программы, но и на стадии проектирования приложения.