Материал: 3574

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

сумма – float

10.ЦЕХ имя – char*

начальник – char* количество работающих – int

11.ПЕРСОНА имя – char*

возраст – int

пол – int(bool)

12.АВТОМОБИЛЬ марка – char* мощность – int стоимось – float

13.СТРАНА

имя – char*

форма

правления – char* площать – float

14.ЖИВОТНОЕ имя – char*

класс – char* средний вес – int

15.КОРАБЛЬ имя – char*

водоизмещение – int

тип – char*

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

1.Что такое конструктор? Для чего он используется? 2.Что такое деструктор? Какой формат его описания?

3.Как определяется указатель на компоненту-функцию?

4.Как определяется указатель на экземпляр класса?

Лабораторная работа №3. Структура класса компонента.

1.Цель лабораторной работы.

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

2.Теоретический материал для домашнего изучения.

Заготовка модуля компонента, созданная в результате указанных ранее действий, имеет следующий вид.

Файл EditLetNum.h: #ifndef EditLetNumH fdefine EditLetNumH

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

finclude <SysUtils.hpp> linclude<Controls.hpp> linclude <Classes.hpp> #include <Forms.hpp> finclude <StdCtrls. hpp>

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

class PACKAGE TEditLetNum : public TEdit

{

private:

protected:

public:

__fastcall TEditLetNum(TComponent* Owner); __published:

}; // ---------------------------------------------------------------

#endif

Файл EditLetNum.cpp: tinclude <vcl.h> #pragma hdrstop finclude "EditLetNum.h"

#pragma package(smart_init)

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

//(Функция ValidCtrCheck используется для проверки того,

//что компонент не содержит чистых виртуальных функций)

static inline void ValidCtrCheck{TEditLetNum *)

{

new TEditLetNum(NULL);

}

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

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

{

}

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

namespace Editletnum {

void __fastcall PACKAGE Register()

{

TComponentClass classes[1] = {__classid(TEditLetNum)};

RegisterComponents("Мои компоненты", classes, 0);

}

}

Собственно говоря, в этой заготовке пока только каркас класса будущего модуля. Файл EditLetNum.cpp содержит три процедуры:

ValidCtrCheck, конструктор TEditLetNum и Register. Процедура

ValidCtrCheck носит вспомогательный характер и вводится, чтобы проверять, не содержит ли компонент чистых виртуальных функций. Тело

конструктора TEditLetNum пока пустое. Позднее оно будет заполнено. А

процедуру Register, регистрирующую компонент на заданной странице библиотеки.

Код регистрации компонента начинается с оператора namespace.

Ключевое слово namespace устанавливает локальность имен данной процедуры регистрации. После этого ключевого слова следует имя файла,

содержащего компоненты. Имя пишется символами в нижнем регистре,

кроме первой заглавной буквы.

В процедуре регистрации Register первый оператор создает массив регистрируемых компонентов classes тнпа TComponentClass и заносит в него регистрируемый компонент. Если бы вы создали два компонента

(пусть имя второго из них TEdit2), регистрируемых на одной странице библиотеки, вы моглн бы занести их в массив оператором:

TComponentClass classes [2] = {__classid(TEditLetNum), __classid(TEdit2)};

Следующий оператор процедуры регистрации регистрирует функцией

RegisterComponents компоненты, занесенные в classes (второй параметр функции) на странице Мои компоненты (первый параметр). Последний параметр является последним индексом массива регистрируемых компонентов.

Теперь рассмотрим коротко описание класса в заголовочном файле

EditLetNum.h. В нем есть разделы private, protected, public и __published.

Они определяют четыре варианта доступа к переменным, процедурам и функциям:

private

Процедуры и функции, определенные таким

(закрытые)

образом, доступны только в пределах данного

 

модуля.

 

 

protected

Процедуры и функции, определенные таким

(защищенные)

образом, доступны в классах потомков.

 

 

public (открытые)

Эти процедуры и функции доступны везде.

 

 

__published

Процедуры и функции доступны везде и

(опубликованные)

имеют связь со средой разработки C++Builder,

 

обеспечивающую вывод на экран в

 

Инспекторе Объектов страниц информации о

 

свойствах и событиях.

 

 

Определение объекта (компонент — это объект) выступает как совокупности свойств, методов и обработчиков событий. Причем свойства

— это совокупность полей данных и методов их чтения и записи.

Вспомним также принцип скрытия информации. Исходя из этого,

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

Задание свойств

Поля данных всегда должны быть защищены от несанкционированного доступа. Поэтому их целесообразно определять в private — закрытом разделе класса. В редких случаях их можно помещать в protected —

защищенном разделе класса, чтобы возможные потомки данного класса имели к ним доступ. Традиционно идентификаторы полей совпадают с именами соответствующих свойств, но с добавлением в качестве префикса символа ―F‖. Таким образом, в нашем примере вы можете занести в раздел private объявления трех необходимых нам полей данных:

class PACKAGE TEditLetNum : public TEdit

{

private: