4.13 Разработка визуальных компонент

C++ Builder позволяет расширять библиотеку VCL собственными компонентами.

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

Прежде всего отметим, что разрабатываемая компонента TMul потомок Tcomponent. Расположим ее на странице Samples библиотеки VCL.

Разрабатывемый компонент содержит свойства методы и события.

Свойства используются для задания определенных атрибутов (полей данных) и инициализации некоторых действий.

Методы - это процедуры и функции, которые делают класс общедоступным.

События используются для расширения компонентов в случае, когда возникают события (например, щелчок мыши).

Разрабатываемый компонент имеет два свойства типа int (Val1 - первый сомножитель, Val2- второй сомножитель) один метод DoMult (перемножает сомножители) и событие TooBig (вызывет обработчик событий, когда один из сомножителей больше 100).

При вызове метода, два значения в свойствах перемножаются и результат становится значением третьего свойства (Res).

Событие TooBig реализуется, если хотя бы одно из чисел больше 100.

Рассмотрим этапы построения TMul.

1.Создадим модуль, используя раздел Component/ New Главного меню.

В закладке Component Wizard указываем Calss Name: – TMul, Ancestor type: - Tcomponent, Pallette Page: – Samples. В результате будет сгенерирован код, который включает стандартную оболочку объявления класса TMul, и поцедуру регистрации класса. Далее модуль сохраняется под именем Mul.cpp. В результате будет созданы файлы: Mul.cpp и Mul.h.

2.Добавление свойств к компоненту. Открываем файл Mul.h и записываем код.

В разделе private определим свойства FVal1, FVal2 - доступные в процессе проектирования и в процессе выполнения и свойство Res -доступное в процессе выполнения. Также описываем событие TooBig, для определения которого используется тип TnitifyEvent – обобщенный указатель на функцию, которая передает один параметр типа Tcomponent – this.

 

class TMul : public TComponent

{

private:

 int FVal1;

 int FVal2;

 int FRes ;

 TNotifyEvent FTooBig;

Далее определим свойства (__property): Res в разделе public, т.к. оно доступно во время выполнения и свойства Val1 и Val2 в разделе __published, т.к. они доступны во время проектирования. Определяем прямой доступ для чтения и записи (read,write) значений переменных в разделе __published

Для переменной FRes прямой доступ не нужен,т.к. свойство Res предназначено только для чтения.

class TMul : public TComponent

{

private:

 int FVal1;

 int FVal2;

 int FRes ;

 TNotifyEvent FTooBig;

 protected:

public:

__fastcall TMul(TComponent* Owner);

 void __fastcall DoMult(void);

//свойство для получения результата

__property int Res = { read=FRes, write=FRes };

__published:

//первый операнд

__property int Val1 = { read=FVal1, write=FVal1, default = 1 };

//второй операнд

__property int Val2 = { read=FVal2, write=FVal2, default = 1 };

//событие

__property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};

 };

Далее загружаем файл Mul.cpp и добавляем код.

3.Добавление конструктора.

Для создания представителя класса вызывается конструктор. Конструктор также:

-                                    устанавливает значения по умолчанию для переменных класса;

-                                    отвечает за динамическое распределение памяти и получение ресурсов, необходимых классу;

-                                    вызывается при добавлении компонента к форме во время проектирования или во время выполнения.

__fastcall TMul::TMul(TComponent* Owner)

: TComponent(Owner)

{

 FVal1 = 1;

 FVal2 = 1;

}

4.Добавление метода.

Для добавления метода необходимо написать код:

void __fastcall TMul::DoMult(void)

{

 if((Val1 < 100) && (Val2 < 100))

 Res = FVal1 * FVal2;

 else

 if (FTooBig) TooBig(this);

}

5.Добавление событие.

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

TooBig, которое запускается когда значение Val1 или Val2 больше 100.

Обработка события осуществляется в строке:

if (FTooBig) TooBig(this);

Если нашем случае FtooBig=TRUE то происходит обработка события.

Листинг файла Mul.h

//---------------------------------------------------------------------------

#ifndef mulH

#define mulH

//---------------------------------------------------------------------------

#include <vcl\SysUtils.hpp>

#include <vcl\Controls.hpp>

#include <vcl\Classes.hpp>

#include <vcl\Forms.hpp>

//---------------------------------------------------------------------------

class TMul : public TComponent

{

private:

 int FVal1;

 int FVal2;

 int FRes ;

 TNotifyEvent FTooBig;

 protected:

public:

__fastcall TMul(TComponent* Owner);

 void __fastcall DoMult(void);

 __property int Res = { read=FRes, write=FRes };

__published:

 __property int Val1 = { read=FVal1, write=FVal1, default = 1 };

 __property int Val2 = { read=FVal2, write=FVal2, default = 1 };

 __property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};

 };

//---------------------------------------------------------------------------

#endif

Листинг файла Mul.cpp:

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "mul.h"

//---------------------------------------------------------------------------

static inline TMul *ValidCtrCheck()

{

return new TMul(NULL);

}

//---------------------------------------------------------------------------

__fastcall TMul::TMul(TComponent* Owner)

: TComponent(Owner)

{

 FVal1 = 1;

 FVal2 = 1;

}

//---------------------------------------------------------------------------

namespace Mul

{

void __fastcall Register()

{

TComponentClass classes[1] = {__classid(TMul)};

RegisterComponents("Samples", classes, 0);

}

}

//---------------------------------------------------------------------------

void __fastcall TMul::DoMult(void)

{

 if((Val1 < 100) && (Val2 < 100))

 Res = FVal1 * FVal2;

 else

 if (FTooBig) TooBig(this);

}

//---------------------------------------------------------------------------

Далее компонент необходимо оттранслировать и включить в библиотеку компонент.

Для включения компонента в библиотеку необходимо:

-           в главном меню выбрать Component/Install;

-           в появившемся окне Install Components выбрать опцию Add;

-           зайти в папку где находится компонента, выбрать файл Mul.cpp и щелкнуть мышью по кнопке OK.

Компонента установится на странице Samples.

Для тестирования компонента используем программу.

На форму поместим три компоненты Edit, три Label, Button и Mul.

Щелкнем по кнопке Button и запишем код.

Mul1->Val1 = StrToInt(EdVal1->Text);

Mul1->Val2 = StrToInt(EdVal2->Text);

Mul1->DoMult();

EdRes->Text = IntToStr(Mul1->Res);

Далее щелкаем мышью справа от события TooBig сомпонеты Mul и записываем код:

Form1->Caption="Переполнение";

Общий вид программы:

//---------------------------------------------------------------------------

#pragma link "mul"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Mul1->Val1 = StrToInt(EdVal1->Text);

Mul1->Val2 = StrToInt(EdVal2->Text);

Mul1->DoMult();

EdRes->Text = IntToStr(Mul1->Res);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Mul1TooBig(TObject *Sender)

{

Form1->Caption="Переполнение";

}

//---------------------------------------------------------------------------

Далее программу можно выполнить.

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


Информация о работе «Основы C»
Раздел: Информатика, программирование
Количество знаков с пробелами: 200759
Количество таблиц: 5
Количество изображений: 11

Похожие работы

Скачать
20474
0
0

... . Имеет ли право на существование эта биологизаторская интерпретация экологии? Видимо, да. Она широко представлена, и с этим следует считаться. Но она не может служить концептуальной основой комплексного непрерывного экологического образования. В структуре научного знания при таком подходе не остаётся места для географической и социальной экологии, экологии человека, а сама биология превращается ...

Скачать
5443
0
0

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

Скачать
8522
1
2

... важные функции управления предприятием, такие как: определение задач; планирование ресурсов; оценка деятельности и мотивация персонала на основе оценки; контроль исполнения. В целом, бюджетирование решает тактические вопросы и, по существу, для стратегического управления не предназначено. Связь бюджетирования со стратегией Практика стратегического планирования западных компаний ...

Скачать
11185
0
0

... . Для этого достаточно измерить его на карте и знать масштаб карты. Компас. Научиться пользоваться компасом нетрудно. Но компас, как правило, наилучшим помощником в ориентировании становится вместе с картой. В спортивном ориентировании пользуются специальными жидкостными компасами. Они позволяют быстро и просто взять с карты нужное направление и двигаться по местности по выбранному азимуту. ...

0 комментариев


Наверх