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

6. Свойства (properties)

Свойство (property) - это атрибут формы или другого компонента, кото­рый влияет либо на визуальное поведение, либо на операции, выполняемые формой или компонентами. Например, свойство Visible определяет, является ли компонент видимым. Аналогично свойство Enable определяет, доступен или нет управляющий элемент. Фактически свойство - это просто имя, свя­занное с полем напрямую или методами записи и/или чтения и наиболее ви­димая часть класса.

При использовании в этом точном техническом значении, термин обо­значает расширение концепции поля данных. Свойство является элементом определения класса и обеспечивает специальную защиту связанных с ним данных, поддерживая их автоматическую настраиваемую обработку при про­смотре и изменении значений. Другими словами, свойство не являются толь­ко данными, которые присваиваются и используются; присвоение и/или ис­пользование этих данных может привести к особым побочным эффектам. Это один из часто используемых вариантов реализации инкапсуляции.

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

6.1. Объявление свойств

Синтаксис объявления свойства класса:

Property <имя свойства>: <тип данных> [Index <целое число>} [Read <поле свойства\метод чтения>] [Write <поле свойства\метод записи>} [Stored <логическое выражение>] [Default <значение по умолчанию>|NoDefault] [DispID <целое число>] [Implements <список интерфейсов>

Примечания:

Delphi позволяет объявлять свойства следующих типов:

простые типы, включая целые и вещественные числа, например Width, Height, символьные, перечислимые (например цвет формы, компонентов), логические (False, True) и диапазоны;

строковые, например имена компонентов (Name), заголовки (Caption), значения

(Text):

множества, например Borderlcons (biSystemMenu, biMinimize, biMaximize, biHelp). Размер публикуемых (Published) свойств типа множество ограничен 32 элементами (0..31). С большим числом элементов можно объявить свойство в разделе Public;

массивы, включая многомерные, например Lines (TStrings). Нельзя объявлять та­кие свойства в разделе Published. Массивы обычно имеют встроенные редакторы для изменения значений;

указатели;

объекты, включая интерфейсные типы, например TFont. Объекты обычно име­ют встроенные редакторы для изменения значений. Свойства-объекты должны проис­ходить от класса TPersistenf.

Объявление свойства никогда не приводит к резервированию памяти для хранения значений свойства, поскольку экземпляр класса хранит значе­ние свойства в одном из соответствующих своих полей.

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

Поля и/или методы доступа могут быть унаследованными, но види­мыми потомком.

Свойства, как и поля, могут использоваться в качестве аргументов процедур и функций, а также участвовать в выражениях, например логиче­ских, математических. Нельзя, однако, передавать их по ссылке (как Var па­раметр), а также использовать с оператором @.

Свойство должно иметь хотя бы один из разделов Read или Write. Ес­ли раздел Read отсутствует, то свойство доступно только для записи, на­пример, для хранения пароля, а, если отсутствует раздел Write, то свойство годится только для чтения и его нельзя модифицировать.

Если потребности в специальных методах нет, то для доступа к по­лям можно вместо имен методов использовать имена полей. Чаще всего так делают для раздела Read.

Методы чтения и записи рекомендуется объявлять в разделе Protected, чтобы их нельзя было неосторожно изменить, а также виртуаль­ными или динамическими, чтобы была возможность переопределить их в потомках. Методы, однако, не должны быть абстрактными (Abstract) или перегружаемыми (Overload).

Если в разделах Read и Write указаны методы, то типы данных поля и свойства могут не совпадать. В этом случае соответствующие преобразо­вания типов должны производится в методах чтения и записи.

Свойства, как и другие составляющие класса, наследуются потомка­ми.

Свойства, объявляемые в разделе Automated класса, могут иметь только разделы Read, Write и DispID.

Type

TAnyClass=Class(TComponent) // Объявление нового класса

Private

FCount: Integer; // Поле для хранения значения свой­ства

Protected

Function GetCount: Integer; // Объявление метода чтения

Procedure SetCount(Value: Integer); // Объявление метода записи

Public

Property Count: Integer Read GetCount Write SetCount Default. 1; // Свойство

End;

Var AnyObject: TAnyClass; // Объявление переменной

Function TAnyClassGetCount: Integer; // Реализация метода чтения

Begin

GetCount:'=FCount; // Присвоение значения

End;

Procedure TAnyClass.SetCount(Value: Integer); // Реализация метода записи

Begin

If Value>=0 Then FCount:=Value Else FCount:=0; // С проверкой на значение

End;

Доступ к значению свойства Count осуществляется через вызовы мето­дов GetCount и SetCount. Однако обращаться напрямую к этим методам нет необходимости, поскольку в программе достаточно написать:

AnyObject.Count:=123;

AVariable:=AnyObject.Count;

Компилятор оттранслирует операторы присвоения в вызовы методов чтения и записи. Если используется прямой доступ к полю, то значения поля будут доступны с помощью операторов присвоения. Таким образом, внешне свойство выглядит в точности как обычное поле, но за всяким обращением к нему могут стоять нужные вам действия. Например, если имеется объект геометрическая фигура и его свойству "цвет" присваивается значение "белый", то произойдет немедленная перерисовка объекта в цвет, соответст­вующий значению свойства.

Важное значение имеют свойства при разработке компонентов. Разра­ботчик может менять реализацию методов, а для пользователей все остается по старому.

В простейшем случае может использоваться прямой доступ к полю. Ча­ще всего прямой доступ используется при операциях чтения значения поля.

Type

TAnyComponent=Class(TConiponent) // Объявление нового класса

Private

FCount: Integer; // Используется для хранения свой­ства

Procedure SetCount(Value: Integer); // Объявление метода записи

Public

Property Count: Integer Read FCount Write SetCount; // Объявление свойства

End;

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

Производные компоненты должны использовать наследуемые свойства. Они не нуждаются в прямом доступе к внутреннему хранению данных.