#include <StdCtrls.hpp> class PACKAGE TNkEdit : public TEdit { private: protected: public: __fastcall TNkEdit(TComponent* Owner); __published: }; #endif
Листинг 6.2.
Файл NkEdit.cpp
#include <vcl.h> #pragma hdrstop #include "NkEdit.h" #pragma package(smart_init) static inline void ValidCtrCheck(TNkEdit *) { new TNkEdit(NOLL); } __fastcall TNkEdit::TNkEdit(TComponent* Owner) : TEdit(Owner) { } namespace NkEdit { void __fastcall PACKAGE Register() { TComponentClass classes[l] = {__classid(TNkEdit)}; RegisterComponents("Samples", classes, 0) ; } }
В файле заголовка NkEdit. h находится объявление нового класса. В файл реализации NkEdit.cpp помещена функция Register, которая обеспечивает регистрацию, установку значка компонента на указанную вкладку палитры компонентов.
В сформированный C++ Builder шаблон компонента нужно внести дополнения: объявить поля данных, функции доступа к полям данных, свойства и методы. Если на некоторые события компонент должен реагировать не так, как базовый, то в объявление класса нужно поместить объявления соответствующих функций обработки событий.
В листингах 6.3 и 6.4 приведены файлы заголовка и реализации компонента NkEdit после внесения всех необходимых изменений.
Листинг 6.3.
nkedit.h
#ifndef NkEditH #define NkEditH #include <SysUtils.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> class PACKAGE TNkEdit : public TEdit { private: bool FEnableFloat; // разрешен ввод дробного числа // диапазон float FMin; // нижняя граница float FMax; // верхняя граница /* функция SetNumb используется для изменения содержимого поля редактирования */ void __fastcall SetNumb(float n); /* Функция GetNumb используется для доступа к полю редактирования */ float __fastcall GetNumb(void); /* эти функции обеспечивают изменение границ диапазона допустимых значений */ bool __fastcall SetMin(float min); bool __fastcall SetMax(float max) ; protected: public: __fastcall TNkEdit(TComponent* Owner); // конструктор /* Свойство Numb должно быть доступно только во время работы программы. Поэтому оно объявлено в секции public. Если надо, чтобы свойство было доступно во время разработки формы и его значение можно было задать в окне Object Inspector, то его объявление нужно поместить в секцию published */__property float Numb = {read = GetNumb }; //, write = SetNumb}; // Функция обработки события KeyPress DYNAMIC
void __fastcall KeyPress(char Skey); published: // объявленные здесь свойства доступны в Object Inspector __property bool EnableFloat = { read = FEnableFloat, write = FEnableFloat }; __property float Min = {read = FMin, write = SetMin }; __property float Max = {read = FMax, write = SetMax }; }; #endif
Листинг 6.5.
Тест компонента NkEdit
#include <vcl.h> #pragma hdrstop #include "tk_.h" #include "nkedit.cpp" #pragma package(smart_init) #pragma resource "*.dfm" TForml *Forml; // форма TNkEdit *NkEdit; // компонент программиста // конструктор формы __£astcall TForml::TForml(TComponent*Owner):TForm(Owner) { // создадим и инициализируем компонент NkEdit NkEdit = new TNkEdit(Forml); NkEdit-> Parent = Forml; NkEdit-> Text = "0"; NkEdit-> Left = 10; NkEdit-ХГор = 100; // настроим компонент // зададим границы диапазона NkEdit-> Min = -100; NkEdit-> Max = 100; NkEdit-> EnableFloat = true; // разрешен ввод дробных чисел } // обработка события FormCreate void __fastcall TForml::FormCreate(TObject *Sender) { AnsiString st = "Введите "; // информация о компоненте if (NkEdit-> EnableFloat) st = st + "дробное"; else st = st + "целое"; st = st + " число от "; st = st + FloatToStr(NkEdit-> Min); st = st + " до "; st = st + FloatToStr(NkEdit-> Max); Label2-> Caption = st; }
Листинг 6.6.
"Сила тока"
// нажатие клавиши в поле Напряжение void __fastcall TForml::NkEditlKeyPress(TObject *Sender, char SKey) { if ( Key == VK_RETORN) NkEdit2-> SetFocus(); } // нажатие клавиши в поле Сопротивление void __fastcall TForml::NkEdit2KeyPress(TObject *Sender, char &Key) { if ( Key == VK_RETORN) Buttonl-> SetFocus(); } // нажатие кнопки Вычислить void __fastcall TForml::ButtonlClick(TObject *Sender) { float u; // напряжение float r; // сопротивление float i; // ток // получить исходные данные из полей ввода u = NkEditl-> Numb; r = NkEdit2-> Nuinb; if ( r == 0) { ShowMessage("Сопротивление не должно быть равно нулю"); return; } // вычислить ток i = u/r; // вывести результат Label4-> Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,3) + "А"; }