Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л16.doc
Скачиваний:
1
Добавлен:
11.09.2019
Размер:
278.02 Кб
Скачать

4. Створення методів компоненту

Методи включаються у відкритий розділ класу - розділ public, оскільки інакше їх не можна було б використовувати. Власне один метод - конструктор TEditLetNum, ви вже написали. Зараз вам треба написати метод Clear, який очищає вміст вікна редагування і що встановлює значення поля FModified рівним false. Генерувати подію OnClear ми доки не будемо. А оскільки базовий клас TEdit вже має метод Clear, що очищує текст, занесений у вікно редагування, то ви можете у вашому перевизначеному методі викликати успадковний метод Clear і додати завдання значення FModified. Щоб точно знати, як виглядає оголошення методу Clear в класі - предку, корисно звернутися до довідки C++Builder і точно відтворити у вашому новому класі визначення перевизначуваного методу. Це оголошення в класі TCustomEdit має вигляд:

virtual void __fastcall Clear(void);

Таким чином, оголошення і реалізація перевизначеного методу Clear може мати вигляд:

class PACKAGE TEditLetNum : public Tedit

{…

public:

virtual void __fastcall Clear(void);

};

void fastcall TEditLetNum::Clear(void)

{

TEdit::Clear ();

//Виклик батьківського методу

FModified = false;

}

Як видно з приведеного коду, для виклику батьківського методу досить просто вказати явним чином клас (у нашому випадку TEdit), метод якого викликається.

Втім, в даному випадку ви могли б і не звертатися до батьківського методу, а просто очистити текст у вікні:

void __fastcall TEditLetNum::Clear(void)

{

Text = ””;

FModified = false;

}

Тепер запишемо головну процедуру, заради якої ми і створювали компонент. процедуру, що дозволяє або забороняє введення символів того або іншого типу. Для цього нам потрібно аналізувати символ, що вводиться користувачем. Це можна робити при обробці події OnKeyPress. Значить, нам потрібно перевизначити стандартну функцію генерації (тобто стандартний обробник) в батьківському компоненті TEdit. Стандартні обробники мають те ж ім'я, що і події, але без префіксу. Він. Тобто обробник події OnKeyPress має ім'я KeyPress. Передавані в стандартний обробник параметри ті ж, що ви можете бачити в заготівці процедури обробки події, якщо клацнете на цій події в Інспекторові Об'єктів, але без параметра Sender. Наприклад, клацнувши в Інспекторі Об'єктів на події OnKeyPress будь-якого компонента, ви побачите, що в процедуру обробки передаються параметри: (TObject *Sender, char &Key)

Це означає, що в створюваному нами обробнику і при виклику батьківського обробника потрібно використовувати тільки один параметр: char &Кеу.

Втім, оскільки вам потрібно буде точно відтворити оголошення перевизначеної функції у класі - предку, звернетеся до довідки C++Builder. Ви побачите, що функція KeyPress наслідувана з класу TWinControl і оголошена в ньому наступним чином:

DYNAMIC void __fastcall KeyPress(char SKey);

Це оголошення потрібно в точності відтворити у своєму класі-спадкоємці. Наприклад, якщо ви пропустите в оголошенні специфікатор DYNAMIC, ви отримаєте при компіляції повідомлення про помилку. В результаті компіляція не буде завершена.

Таким чином, введення в модуль компонента потрібної нам функції може звестися до включення в розділ класу protected приведеного вище оголошення і написанню у файлі модуля реалізації функції :

void __fastcall TEditLetNum::KeyPress(char &Key)

{

Set <char, '0 ', ' 9'> Dig;

Dig << '0' <<'1' <<'2' <<'3' <<'4' <<'5' << '6' << '7' << '8' << '9';

if ((! FEnableNum) && (Dig.Contains(Key))) Key = 0;

if ((! FEnableLet) && !(Dig.Contains(Key))) Key = 0;

if (Key !=0) FModified = true;

TEdit:: KeyPress (Key);

}

Ця функція спочатку замінює неприпустимі символи нульовими. Якщо символ допустимий, то задається значення true полю властивості FModified. У кінці викликається метод KeyPress батьківського класу.

Можете скомпілювати і протестувати отриманий компонент. Можливий вид нового варианту тестуючого застосування представлений на малюнку.

Форма містить компонент EditLetNum, кнопку Button з написом Clear (при її натисненні виконується метод Clear, мітку Label, в якій відображується значення властивості Modified компонента EditLetNuml, і три індикатори типу TCheckBox. Два з них (назовіть їх CBNum і CBLet) вказують допустимість введення цифр і букв.

Обробник події OnCreate форми може мати вид:

void __fastcall Tform1::FormCreate(TObject *Sender)

{

if (EditLetNum1->Modified)Label1 ->Caption = "Modified = true";

else Label1 -> Сaption = "Modified = false";

}

Цей обробник заносить в мітку Label1 повідомлення про поточне значення властивості Modified.

У обробнику події OnKeyUp компонента EditLetNum напишіть оператор:

FormCreate(Sender);

Цей оператор викликає той же приведений вище обробник події OnCreate форми для відображення поточного значення Modified.

Обробник події OnClick індикатора CBNum може мати вигляд:

EditLetNum1->EnableNum = CBNum ->Checked;

CBLet ->Checked = EditLetNum1 ->EnableLet;

EditLetNum1 ->SetFocus();

Перший оператор цього обробника встановлює значення параметра EnableNum залежно від стану індикатора CBNum. Другий оператор встановлювє стан індикатора CBLet рівним значенню параметра EnableLet. Це потрібно, оскільки якщо, наприклад, скидається в false значення параметра EnableNum, а значення параметра EnableLet у цей момент теж було рівне false, то компонент EditLetNuml встановить значення EnableLet рівним true. І потрібно, щоб це нове значення відобразилося в індикаторі CBLet.

Аналогічно може виглядати обробник події OnClick індикатора CBLet :

EditLetNum1 ->EnableLet = CBLet ->Checked;

CBNum ->Checked = EditLetNum1 ->EnableNum;

EditLetNum1 ->SetFocus();

У обробнику події OnClick кнопки Clear напишіть:

EditLetNum1 ->Clear();

FormCreate(Sender);

Ці оператори перевірять роботу введеного вами методу Clear і відобразять на екрані зміну значення властивості Modified.

У вашому тестовому застосуванні встановіть властивочті EnableNum і EnableLet відповідно до того, які початкові значення індикаторів CBNum і CBLet ви задали. Активізуйте у вікні Менеджера Проектів вершину вашого тестового застосування, запустите його на виконання і перевірте в роботі при різних значеннях властивостей EnableNum і EnableLet.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]