- •Система Pascal abc
- •Редактор
- •Горячие клавиши
- •Окно вывода
- •Окно ввода
- •Запуск и остановка программы
- •Программа прервана пользователем
- •Пошаговое выполнение программы
- •Окно отладки
- •Pascal abc Язык Pascal abc Структура программы
- •Идентификаторы и служебные слова
- •Выражения и операции
- •Арифметические операции
- •Операция @
- •Операции с указателями
- •Операции с множествами
- •Приоритет операций
- •Описание переменных и констант
- •Описание типов
- •Обзор типов
- •Все порядковые типы, а также типы boolean, real и complex называются простыми типами. Порядковые типы
- •Типы boolean, real и complex
- •Строковый тип
- •Массивы
- •Множества
- •Указатели
- •Процедурный тип
- •Эквивалентность типов
- •Неявное приведение типов
- •Явное приведение типов
- •Область действия идентификатора
- •Ввод и вывод. Форматы вывода
- •Оператор присваивания
- •Условный оператор
- •Составной и пустой операторы
- •Оператор выбора
- •Оператор цикла for
- •Оператор цикла repeat
- •Оператор вызова процедуры
- •Операторы break, continue и exit
- •Оператор with
- •Оператор безусловного перехода goto
- •Оператор try ... Except
- •Оператор try ... Finally
- •Оператор raise
- •Описание процедур и функций
- •Параметры процедур и функций
- •Локальные и глобальные переменные
- •Общие стандартные процедуры и функции
- •Стандартные процедуры и функции для работы со строками
- •Стандартные процедуры и функции для работы с файлами
- •Стандартные процедуры и функции для работы с памятью
- •Системные процедуры и функции
- •Стандартные константы
- •Обзор классов и объектов
- •Конструкторы и деструкторы
- •Свойства
- •Переменная Self
- •Наследование
- •Видимость членов класса
- •Переопределение методов
- •Приведение типов объектов
- •Операции is и as
- •Виртуальные методы и полиморфизм
- •Модуль crt
- •Модуль Timers
- •Модуль Sounds
- •Модуль Utils
- •Модуль PointRect
- •Модуль GraphAbc
- •Графические примитивы
- •Цветовые константы и функции для работы с цветом
- •Действия с пером
- •Действия с кистью
- •Действия со шрифтом
- •Действия с рисунками
- •Действия с графическим окном
- •Задание режимов вывода
- •Класс Picture
- •Описатели рисунков и класс Picture
- •Исполнитель Робот
- •Алгоритмизация
- •Алгоритм и его свойства
- •Способы описания алгоритмов
- •Линейные алгоритмы
- •Разветвляющиеся алгоритмы
- •Алгоритмы циклической структуры
- •Подчиненные алгоритмы
- •Системы программирования
- •Лабораторная работа № 1 Программирование линейных алгоритмов
- •Лабораторная работа № 2 Программирование разветвляющихся алгоритмов
- •Лабораторная работа № 4 Одномерные массивы - вектора
- •Литература Основная литература:
- •Дополнительная литература:
- •Лабораторная работа № 3 Программирование циклических алгоритмов
Свойства
Свойства позволяют осуществлять доступ к полям класса, попутно выполняя некоторые действия. Свойство описывается в классе следующим образом:
property Prop: тип read имя функции чтения write имя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью функции чтения, а меняет - с помощью процедуры записи. Функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
function getProp: тип; procedure setProp(v: тип);
Секция write может быть опущена, тогда доступ к полю через свойство можно осуществлять только на чтение (свойства только для чтения).
Например, рассмотрим тип Person (персона), имеющий поле _age (возраст). Доступ к полю _age будем осуществлять через свойство Age:
type Person=class _age: integer; procedure setAge(a: integer); begin if a>0 then _age:=a else writeln('Ошибка в Person.setAge: возраст не может быть отрицательным'); end; function getAge: integer; begin writeln('Осуществлен доступ к полю _age на чтение'); Result:=_age; end; property Age: integer read getAge write setAge; end; var p: Person; a: integer; ... p:=Person.Create; p.Age:=-3; // выводится сообщение об ошибке i:=p.Age; // выводится сообщение о чтении поля _age
Всякий раз, когда мы присваиваем свойству Age новое значение , вызывается процедура setAge с соответствующим параметром. Всякий раз, когда мы считываем значение свойства Age, вызывается функция getAge.
Из примера видно, что свойства ведут себя аналогично полям. При этом они могут производить дополнительные действия, например, проверку на допустимость присваиваемого значения. Доступ же к полям классов напрямую сопряжен с ошибками:
p._age:=-3;
Присваивание полю _age отрицательного значения ошибочно, но подобная ошибка не будет обработана.
Вместо имени функции чтения или имени процедуры записи можно использовать имя поля, например:
property Age: integer read _age write setAge;
В этом случае строка i:=p.Age эквивалентна строке i:=p._age.
Обычно для доступа к полю на чтение в секции read свойства указывается именно поле, т.к. обычно при чтении поля никаких дополнительных действий производить не требуется.
Свойства не могут передаваться по ссылке в процедуры и функции. Например, следующий код ошибочен:
Inc(p.Age); // ошибка!
Если требуется обработать значение свойства, передав его по ссылке, то надо воспользоваться вспомогательной переменной:
a:=p.Age; Inc(a); p.Age:=a;
Свойства очень удобны при работе с визуальными объектами, поскольку позволяют автоматически перерисовывать объект, если изменить какие-либо его визуальные характеристики. Например, если создана кнопка b1 типа Button, то для визуального изменения ее ширины достаточно присвоить значение ее свойству Width:
b1.Width:=100;
Процедура для записи этого свойства в приватное поле _width будет выглядеть примерно так:
procedure SetWidth(w: integer); begin if (w>0) and (w<>_width) then begin _width:=w; <перерисовка кнопки> end end;
Следует обратить внимание на вторую часть условия в операторе if: w<>_width. Добавление этой проверки позволяет избежать лишней перерисовки кнопки в случае, если ее ширина не меняется.