Разработка визуальных компонент
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="Переполнение"; } //--------------------------------------------------------------------------- Далее программу можно выполнить. Кроме рассмотренного примера возможна модификация существующих визуальных компонент и получение новых компонент на базе существующих.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|