Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3574

.pdf
Скачиваний:
2
Добавлен:
08.01.2021
Размер:
594.89 Кб
Скачать

bool CanClear = true;

if {OnClear} OnClear(this,CanClear); if (CanClear) {

TEdit::Clear(); // Вызов родительского метода

FModified = false;

}

}

В этой функции вводится булева переменная CanClear. При наличии обработгг чика пользователя он вызывается и CanClose передается в этот обработчик в качестве второго параметра. Затем в зависимости от значения

CanClose вызывается или не вызывается родительский метод очистки OnClear.

Теперь ваш компонент завершен. Полный текст его файлов имеет следующий вид.

Файл EditLetNum.h:

// Объявление типа события

typedef void __fastcall (__closure *TClear)

(System::TObject *Sender, bool& CanClear); class PACKAGE TEditLetNum : public TEdit

{

private:

// Закрытые элементы-данные класса bool FEnableLet;

bool FEnableNum; bool FModified; TClear FOnClear; protected:

// Защищенные методы записи

void __fastcall SetEnableLet(bool AEnableLet);

42

void __fastcall SetEnableNum(bool AEnableNum) ; //Переопределение метода KeyPress

DYNAMIC void __fastcall KeyPress(char &Key); public:

// Объявление конструктора

__fastcall TEditLetNum{TComponent* Owner);

// Объявление метода Сlea г virtual void __fastcall Clear(void);

// Свойство только времени выполнения

__property bool Modified = {read=FModified, default=false}; __published:

// Свойства компонента, включаемые в Инспектор Объектов

__property bool EnableLet = {read=FEnableLet, write=SetEnableLet, default=true};

__property bool EnableNum = {read=FEnableNum, write=SetEnableNum, default=true};

__property TClear OnClear = {read=FOnClear, write=FOnClear}; };

Файл EditLetNum.cpp:

static inline void ValidCtrCheck(TEditLetNum *)

{

new TEditLetNum(NULL);

}

//---------------------------------------------------------------------------------------

__fastcall TEditLetNum::TEditLetNum (TComponent * Owner) : TEdit (Owner)

{

FEnableLet = true;

43

FEnableNum = true;

FModified = false;

}

//----------------------------------------------------------------------------------------

namespace Editletnum

{

void __fastcall PACKAGE Register()

(

TComponentClass classes [1] = {__classid(TEditLetNum)}; RegisterComponents("Мои компоненты", classes, 0);

}

}

//----------------------------------------------------------------------------------------

void __fastcall TEditLetNum::SetEnableNum(bool AEnableNum)

{

//Присваивание значения полю FEnableNum

FEnableNum = AEnableNum;

//Если значения FEnableNum и FEnableLet = false,

//то полю FEnableLet присваивается true

if (! AEnableNum) if (! FEnableLet) FEnableLet = true;

}

//----------------------------------------------------------------------------------------

void __fastcall TEditLetNum::SetEnableLet(bool AEnableLet)

{

//Присваивание значения полю FEnableLet

FEnableLet = AEnableLet;

//Если значения FEnableNum и FEnableLet = false,

//то полю FEnableNum присваивается true

if (! AEnableLet) if (! FEnableNum) FEnableNum = true;

44

}

//----------------------------------------------------------------------------------------

void __fastcall TEditLetNum::Clear(void)

{

bool CanClear = true;

if (OnClear) OnClear(this,CanClear); if (CanClear)

{

 

TEdit::Clear();

// Вызов родительского метода

FModified = false;

 

}

 

}

 

//----------------------------------------------------------------------------------------

void __fastcall TEditLetNum::KeyPress(char &Key)

{

Set Cchar, '0', '9'> Dig;

Dig << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9'; if Z ((! FEnableNum) && (Dig.Contains(Key)))

Key = 0;

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

if (Key != 0) FModified = true; TEdit::KeyPress(Key);

Откомпилируйте этот код. Теперь надо изменить тестирующее приложение. Возможный вид его уже был представлен выше. Только раньше не пояснялось назначение еще одного индикатора CheckBox (назовем его

CBClear), около которого написано «Очистка». Он предназначен для задания значения CanClear в обработчике события OnClear. Поэтому по сравнению с

45

прежним приложением надо изменить обработчик OnClear, добавив в него анализ того, установлен флажок в индикаторе CBClear, или нет (анализ свойства Checked). Но тут вы столкнетесь с трудностью, если тестовое приложение делаете не заново, а изменяя предыдущее. По сравнению с прошлым вариантом компонента в функцию обработчика добавился параметр.

Поэтому прежний обработчик события OnClear будет выдавать вам синтаксические ошибки. Надо или уничтожить его и написать новый, или вручную исправить заголовки в объявлении обработчика и в его реализации,

которая может иметь вид:

void __fastcall TForml::EditLetNumlClear(TObject *Sender, bool SCanClear)

{

ShowMessage("Событие OnClear");

CanClear = CBClear->Checked;

EditLetNum1->SetFocus();

}

В этом обработчике значение параметра CanClear, разрешающего или запрещающего очистку, задается в зависимости от того, установлен или нет индикатор CBClear.

Вот и все. Не забудьте только согласовать исходные значения параметров

EnableNum и EnableLet с исходными состояниями индикаторов CBNum и CBLet. Если, например, вы установили EnableNum в true, a EnableLet в false, то индикатор CBNum должен быть включен (свойство Checked = true), а

индикатор CBLet выключен.

Запустите приложение и убедитесь в правильной работе вашего компонента.

3.Задания к лабораторной работе.

1.Выбрать группу объектов, которые будут обрабатывать события.

46

2.Для выбранной группы объектов определить перечень операций, которые должны выполняться по командам пользователя.

3.Определить вид командной строки <код_операции><параметры>. Решить вопросы: как кодируются операции? какие передаются параметры?

4.Определить иерархию объектов. Если необходимо, добавить новые объекты (группы объектов).

5.Определить иерархию классов. Если необходимо, добавить новые классы.

6.Определить, какой объект в программе играет роль приложения. В случае необходимости добавить в иерархию классов класс TApp. Решить, в каком классе будет метод Execute, организующий главный цикл обработки событий.

7.Определить и реализовать необходимые для обработки событий методы.

8.Написать основную функцию (main).

4. Контрольные вопросы.

1.Как определить иерархию классов и объектов?

2. Что такое перегрузка операций и функций в С++? 3.Что такое шаблон?

4.Как создается шаблон и как используется для разных типов?

47

Валерий Викторович Лавлинский Олеся Владимировна Оксюта Юрий Геннадьевич Табаков

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Методические указания к лабораторным работам для студентов специальности

09.05.01 – Применение и эксплуатация автоматизированных систем специального назначения

Редактор Е.А. Богданова

Подписано в печать ….. Формат 60×90 /16. Объем … п. л. Усл. печ. л. ….. Уч.-изд. л. …... Тираж ….. экз. Заказ ФГБОУ ВО «Воронежский государственный лесотехнический

университет им. Г.Ф. Морозова» РИО ФГБОУ ВО «ВГЛТУ им. Г.Ф. Морозова»394087, г. Воронеж, ул.

Тимирязева, 8 Отпечатано в УОП ФГБОУ ВО «ВГЛТУ им. Г.Ф. Морозова».

394087, г. Воронеж, ул. Докучаева, 10

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