class PACKAGE TNkEdit
Листинг 6.1.
Файл NkEdit.h
#ifndef NkEditH
#define NkEditH #include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#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) + "А"; }
Содержание раздела