Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Компонентная модель Borland Delphi



Компонентный класс – это специальная разновидность класса, оформленная по особым правилам и наделенная особым поведением. С помощью компонентных классов описываются объекты, которые могут использоваться в процессе автоматизированного создания приложений с помощью современных инструментальных средств быстрой разработки (RAD – Rapid Application Development). Компоненты могут встраиваться в состав таких инструментов и многократно использоваться с автоматической генерацией части создаваемого программного кода. В простых приложениях иногда удается вообще обойтись без написания какого-либо кода.

В основе компонентной модели Borland Delphi лежит возможность объявления в классе специальных элементов – так называемых свойств (property). Свойства обеспечивают доступ к внутренним закрытым полям только с помощью специальных методов доступа. Общая схема использования свойств:

· объявить внутреннее закрытое поле данных;

· объявить и реализовать два метода доступа (обычно – защищенные);

· объявить (с помощью директивы property) открытое свойство с указанием (с помощью директив read и write) используемых методов доступа.

Схематично это реализуется следующим программным кодом:

TSomeClass = class

private FSomeField: <тип поля>; // закрытое поле данных

protectedfunction GetSomeField: <тип поля>; // методы доступа

protectedprocedure SetSomeField (aField: <тип поля>);

publicproperty SomeField: <тип поля> // свойство как таковое

read GetSomeField write SetSomeField;

end;

Простейшая реализация методов доступа:

function TSomeClass.GetSomeField: <тип>;

begin

result:= FSomeField;

end;

procedure TSomeClass.SetSomeField (aField: <тип>);

begin

if aField <> FSomeField then FSomeField:= aField;

end;

Синтаксически свойства в программе используются следующим образом:

· как обычно, объявляется и создается объектная переменная

var SomeObject: TSomeClass;

SomeObject:= TSomeClass.Create;

· свойству присваивается некоторое значение в соответствии с его типом

SomeObject.SomeField:= <значение>;

· значение свойства присваивается некоторой переменной

< переменная>:= SomeObject.SomeField;

При этом последние два присваивания переводятся компилятором в вызовы соответствующих методов доступа. В простейшем случае допускается отсутствие методов доступа с указанием в описании свойства имени соответствующего закрытого поля:

TSomeClass = class

private FSomeField: <тип поля>;

publicproperty SomeField: <тип поля>

read FSomeField write FSomeField;

end;

Вместо директивы public при описании свойств часто используется директива published, которая определяет так называемые «публикуемые» свойства. Особенность таких свойств состоит в том, что в процессе создания приложения они видны в окне Инспектора Объектов (Object Inspector) и могут изменяться разработчиком.

Вторым важным аспектом создания компонентных классов является возможность наделения их механизмом реагирования на внешние события. Для этого в состав компонентного класса вводятся специальные закрытые поля, в которых хранятся адреса (указатели) подпрограмм, отвечающих за обработку соответствующих событий. Такие поля объявляются с помощью специального так называемого процедурного типа. Каждый процедурный тип имеет свое имя, описывается специальным образом и фактически определяет группу подпрограмм с одинаковым набором параметров. Например:

type TSomeProcType = procedure (параметры) ofobject;

Переменной типа TSomeProcType в качестве значения можно присвоить имя любого метода, у которого набор, тип и порядок параметров соответствует описанному. Кратко можно сказать, что в объектной модели Borland Delphi событие является свойством процедурного типа.

В библиотеке классов VCL объявлено несколько стандартных процедурных типов, используемых для создания обработчиков событий. Простейшим типом является тип TNotifyEvent, который вводит класс методов-обработчиков, имеющих только один параметр Sender типа TObject, через который передается указатель на объект-источник события:

TNotifyEvent = procedure (Sender: TObject) ofobject;

Этот тип используется для обработки так называемых уведомляющих событий, обычно возникающих при выборе управляющих кнопок формы, пунктов меню и т.д. Более сложные процедурные типы предусмотрены для обработки событий от мыши и клавиатуры:

TKeyEvent = procedure (Sender: TObject; var Key: word;

Shift: TShiftState) ofobject;

TMouseEvent = procedure (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; x,y: integer) ofobject;

Как правило, стандартных процедурных типов и событий вполне хватает для решения большинства задач. При необходимости легко можно ввести и нестандартные события. Для этого надо:

· объявить новый процедурный тип

TNewEventProc = procedure (параметры) ofobject;

· ввести новый класс с объявлением в нем свойств-событий с использованием упрощенной схемы описания свойств (без объявления методов доступа)

TNewClass = class (КлассРодитель)

private FOnNewEvent: TNewEventProc; // поле процедурного типа

publishedproperty OnNewEvent: TNewEventProc

read FOnNewEvent write FOnNewEvent;

· ввести переменную-объект класса TNewClass (например – NewObj) и присвоить свойству-событию имя метода-обработчика этого события (например – имя NewEventHandler)

NewObj. OnNewEvent:= NewEventHandler;

Естественно, метод NewEventHandler должен быть предварительно объявлен в полном соответствии с типом TNewEventProc.

Для использования компонентов как строительных блоков при создании приложений в библиотеке VCL предусмотрено большое число классов. Несколько из них, расположенных на верхних уровнях иерархии, обеспечивают наиболее общие свойства всех компонентов. К этим классам прежде всего относятся классы TPersistent и TComponent.

Класс TPersistent является непосредственным потомком базового класса TObject. Важность данного класса определяется тем, что он вводит механизм потоковости или сериализации, т.е. все его потомки (в том числе абсолютно любые компоненты) могут сохранять свои свойства в дисковых файлах-потоках и восстанавливать свойства из файлов. Для этого в классе вводится метод Assign, с помощью которого поля одного объекта могут быть присвоены полям другого объекта.

Класс TComponent, как следует из его имени, является базовым классом для всех компонентов. Он происходит непосредственно от класса TPersistent и вводит несколько наиболее общих свойств и методов, наследуемых всеми компонентами. Наиболее важными из них являются те, что отвечают за поддержку механизма владения: каждый компонент имеет своего владельца и сам может владеть другими компонентами. Механизм владения очень важен для создания и уничтожения объектов-компонентов с точки зрения выделения и освобождении динамической памяти. Например, форма как визуальная единица приложения владеет всеми размещенными на ней компонентами, т.е. является специализированным контейнером. При закрытии формы это позволяет легко и корректно освободить память, выделенную для всех компонентов формы.

Механизм владения поддерживается в классе TComponent с помощью трех основных свойств:

· свойство Components представляет собой массив указателей на подчиненные компоненты;

· свойство ComponentCount определяет текущее число подчиненных компонентов;

· свойство Owner содержит указатель на хозяина компонента.

Методы класса TComponent обеспечивают стандартные операции добавления, удаления и поиска в контейнере.

Еще одним общим моментом для всех компонентов является способ их использования при визуальном создании приложений. Каждый компонент регистрируется в Delphi и становится доступным для выбора в палитре компонентов. Этот выбор с помещением значка компонента на форму приводит к созданию соответствующего объекта, после чего в Инспекторе Объектов становятся доступными для редактирования все опубликованные свойства компонента, включая создание обработчиков событий.

Всех потомков класса TComponent можно разделить на две группы – визуальные и невизуальные компоненты. Визуальные компоненты имеют видимое графическое представление на форме как в процессе разработки приложения, так и при его выполнении. Базовым классом визуальных компонентов является потомок класса TComponent – класс TControl. В нем вводятся такие общие свойства, как положение компонента, его текущее состояние и стиль, а также определяются все основные обработчики событий. Основными невизуальными компонентами являются компоненты доступа к базам данных, компоненты-диалоги, компонет-таймер и другие.

Необходимо отметить, что в последних на момент написания пособия версиях пакета Delphi 2005/2006 компонентная модель немного изменена с учетом особенностей платформы.NET (эти особенности кратко рассматриваются в разделе 5.1.3).





Дата публикования: 2014-11-02; Прочитано: 856 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...