:: Меню ::

Головна
Передмова
СЕРЕДОВИЩЕ РОЗРОБКИ C++ BUILDER
Початок роботи
Перший проект
ПРАКТИКУМ ПРОГРАМУВАННЯ
Графіка
Мультимедіа
Бази даних
Компонент програміста
Консольне застосування
Довідкова система
Створення настановного диска
Приклади програм
C++ Builder — короткий довідник
Книга для гостей
Контакти
Добавити у вибране

:: Друзі ::

 
Здесь можно узнать Адрес Оболонский районный суд , где находиться суд

:: Лічильники ::

=

 

 

 

 

 

Створення модуля компоненту



Перед початком роботи із створення нового компоненту потрібно створити окремий каталог для модуля і інших файлів компоненту. Після цього можна приступити до створення компоненту.

Щоб почати роботу над новим компонентом, треба активізувати процес створення нового застосування (команда File | New | Application), у меню Component вибрати команду New Component і в поля діалогового вікна New Component (мал. 6.1) ввести інформацію про створюваний компонент.



Мал. 6.1. Початок роботи над новим компонентом


У полі Ancestor type треба ввести базовий тип створюваного компоненту. Для компоненту, що розробляється, базовим компонентом є стандартний компонент Edit (поле введення-редагування). Тому базовим типом компоненту, що розробляється, є тип Tedit.

У полі Class Name необхідно ввести ім'я класу компоненту, що розробляється (наприклад Tnkedit). Пригадаєте, що в C++ Builder прийнята угода, згідно якій імена типів повинні починатися буквою т. У полі Palette Page потрібно ввести ім'я вкладки палітри компонентів, на яку буде поміщений значок компоненту. Назву вкладки палітри компонентів можна вибрати із списку, що розкривається. Якщо в полі Palette Page ввести ім'я ще не існуючої вкладки палітри компонентів, то безпосередньо перед додаванням компоненту вкладка з вказаним ім'ям буде створена.

У полі Unit file name знаходиться автоматично сформоване ім'я файлу модуля створюваного компоненту. C++ Builder привласнює модулю компоненту ім'я, яке збігається з ім'ям типу компоненту, але без букви т. Клацнувши на кнопці з трьома крапками, можна вибрати каталог, в якому має бути збережений модуль компоненту.

В результаті клацання на кнопці ОК буде сформований модуль компоненту, що складається з двох файлів: файлу заголовка (лістинг 6.1) і файлу реалізації (лістинг 6.2).

Лістинг 6.1. Файл Nkedit.h

#ifndef Nkedith
#define Nkedith
#include   <Sysutils.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.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 (Кеу) 
{ case '0' :
case   '1'
case   '2'
case   '3'
case   '4'
case   '5'
case   '6'
case   '7'
case   '8'
case   '9'  break;
case '.' case ', '
Кеу = Decimalseparator;
if (Text.Pos(Decimalseparator) || (! Fenablefloat))
Кеу = 0; break;
case '-' : // знак "мінус"
if (Text.Length()|I(Fmin >= 0))
// мінус вже введений або Fmin >= Об Кеу = 0; break;
case Vkj3ack:   // клавіша <Backspace> break;
default :  // решта символів заборонена
Кеу = 0; }
if ((Кеу >='0') && (Кеу <= '9')) {
/* Перевіримо, чи не приведе введення чергове 
цифри до виходу числа за межі діапазону.
 Якщо так, то замінимо введене 
число на максимальне або мінімальноє*/
Ansistring st = Text + Кеу;
 if (Strtofloat(st)< Fmin) {
Кеу = 0;
Text =  Floattostr(Fmin); } if (Strtofloat(st)> Fmax) {
Кеу = 0;
Text = Floattostr(Fmax); } }
// викликати функцію обробки події Keypress базового класу 
Tedit::keypress(Кеу);
}
// встановлює значення поля 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;
}

У оголошенні класу Tnkedit додані оголошення полів Fenabiedfloat, Fmin і Fmax. Імена полів, згідно прийнятому в C++ Builder угоді, 'починаються з букви F (від Field поле). Поле Fenabledfioat зберігає ознаку можливості введення в полі редагування дробового числа. Поля Fmin і Fmax зберігають межі діапазону. Доступ до полів забезпечують відповідні властивості: Enabiedfloat, Min і мах. Оскільки оголошення цих властивостей знаходяться в секції publishedто вони будуть доступні у вікні Object Inspector. Властивість Numb що є числом, яке знаходиться в полі редагування, оголошено в секції public тому воно доступне тільки під час роботи програми. Тут слід звернути увагу на те, що у властивості Numb немає відповідного поля. Значення цієї властивості обчислюється під час роботи програми шляхом перетворення в число значення властивості Text базового компоненту. Властивості Min і мах отримують доступ до полів даних для читання безпосередньо, для запису — за допомогою функцій Setmin і Setmax. Звойство Enabдedfдoat получаєт доступ до поля Fenabledfloat для читання і записи безпосередньо. Оскільки компонент Nkedit повинен забезпечити фільтрацію символів (у полі редагування повинні відображатися тільки цифри і, у випадку, якщо значення властивості Enabiedfloat рівно true десятковий роздільник), то в оголошення класу додано оголошення функції Keypress яка призначена для обробки відповідної події.

Реакцію компоненту Nkedit на натиснення клавіші клавіатури визначає функція Tnkedit::keypress. Як параметр ця функція отримує код натиснутої клавіші. Перед викликом функції Tedit: :KeyPress, яка забезпечує обробку події Keypress базовим компонентом, код натиснутої клавіші перевіряється на допустимість. Якщо натиснута неприпустима клавіша, то код символу замінюється на нуль. Допустимими для компоненту Nkedit залежно від його налаштування, є цифрові клавіші, роздільник цілої і дробової частин числа (залежно від налаштування Windows, крапка або кома), "мінус" і клавіша <Backspase>.

Тут слід пригадати, що в тексті програми дробова частина числової константи відділяється від цілої частини крапкою. Під час роботи програми при введенні початкових даних користувач повинен використовувати той символ, який заданий в налаштуванні Windows. Як роздільник зазвичай використовують кому (стандартне для Росії налаштування) або крапку. Приведена процедура обробки події onkeypress враховує, що налаштування Windows може мінятися, і тому введений користувачем символ порівнюється не з константою, а із значенням глобальної змінної Decimalseparatorяка містить символ-роздільник, використовуваний в Windows в даний момент.

 


https://nskgirls.org/ankets/cheap дешевые в Новосибирске.
x

:: Наша кнопка ::

Отримати код:

Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


:: Реклама ::


:: Посилання ::

-


 

 

 


Copyright by Zvircom © 2009