Создание модуля компонента
Листинг 6.4 .nkedit.cpp.
#include <vcl.h> #pragma hdrstop #include "NkEdit.h" #pragma package(smart_init) static inline void ValidCtrCheck(TNkEdit *) { new TNkEdit(NULL); } // конструктор __fastcall TNkEdit::TNkEdit(TComponent* Owner) : TEdit(Owner) { // конструктор имеет прямой доступ к полям компонента Text = "0"; FMin = 0; FMax = 100; FEnableFloat = true; } namespace Nkedit { void __fastcall PACKAGE Register() { TComponentClass classes[l] = {__classid(TNkEdit)}; RegisterComponents("Samples", classes, 0); } } void __fastcall TNkEdit::SetNumb(float n) { Text = FloatToStr(n); } // возвращает значение, соответствующее строке, // которая находится в поле редактирования float __fastcall TNkEdit::GetNumb(void) if (Text.Length()) return StrToFloat(Text); else return 0; } // функция обработки события KeyPress в поле компонента NkEdit void __fasteall TNkEdit::KeyPress(char &Key) { // Коды запрещенных клавиш заменим нулем, в результате чего // эти символы в поле редактирования не появятся switch (Key) { case '0': case '1' case '2' case '3' case '4' case '5' case '6' case '7' case '8' case '9' break; case '.' case ', ' Key = DecimalSeparator; if (Text.Pos(DecimalSeparator) || (! FEnableFloat)) Key = 0; break; case '-': // знак "минус" if (Text.Length()|I(FMin >= 0)) // минус уже введен или FMin >= О Key = 0; break; case VKJ3ACK: // клавиша <Backspace> break; default: // остальные символы запрещены Key = 0; } if ((Key >='0') && (Key <= '9')) { /* Проверим, не приведет ли ввод очередной цифры к выходу числа за границы диапазона. Если да, то заменим введенное число на максимальное или минимальное*/ AnsiString st = Text + Key; if (StrToFloat(st) < FMin) { Key = 0; Text = FloatToStr(FMin); } if (StrToFloat(st) > FMax) { Key = 0; Text = FloatToStr(FMax); } } // вызвать функцию обработки события KeyPress базового класса TEdit::KeyPress(Key); } // устанавливает значение поля FMin bool __fastcall TNkEdit::SetMin(float min) { if (min > FMax) return false; FMin = min; return true; } // устанавливает значение поля FMin bool __fastcall TNkEdit::SetMax(float max) { if (max < FMin) return false; FMax = max; return true; }