Виходячи з принципу інкапсуляції, поля даних завжди мають бути захищеними від несанкціонованого доступу. Доступ до них, як правило, повинен здійснюватися через властивості, що включають методи читання і запису полів. Тому поля доцільно оголошувати в розділі private – закритому розділі класу. Зрідка їх можна поміщати в protected -захищеному розділі класу, щоб можливі потомки даного класу мали до них доступ. Традиційно ідентифікатори полів співпадають з іменами відповідних властивостей, але з додаванням у якості префікса символа 'F'.
property <ім’я>:<тип> read <ім’я поля чи методу читання> write <ім’я поля чи методу запису> <директиви запам’ятовування>
Якщо в розділах read чи write записане ім’я поля, то передбачається пряме читання чи запис даних.
Якщо в розділі read записане ім’я методу читання, то читання буде здійснюватися лише функцією з цим іменем. Функція читання – це функція без параметру, що повертає значення того типу, який оголошений для властивості. Ім’я функції читання прийнято починати з префіксу Get, після якого йде ім’я властивості.
Якщо в розділі write записане ім’я методу запису, то запис буде здійснюватися лише процедурою з цим іменем. Процедура запису – це процедура з одним параметром того типу, який оголошений для властивості. Ім’я процедури запису прийнято починати з префіксу Set, після якого йде ім’я властивості.
Якщо розділ writeвідсутній в оголошенні властивості, значить це властивість лише для читання і користувач не може задавати його значення.
Директиви запам’ятовування визначають, як потрібно зберігати значення властивості при збереженні користувачем форми .dfm. Найчастіше використовується директива
default <значення по замовчуванню>
Вона не задає початкових умов, це завдання конструктора. Директива просто оголошує, що якщо користувач в процесі проектування не поміняв значення властивості за замовчуванням, то зберігати значення властивості не потрібно.
Приведемо приклад. Нехай потрібно оголосити клас з іменем MyClass, що є безпосереднім спадкоємцем TObject і має властивість цілого типу з іменем А. Тоді оголошення цього класу може мати вигляд:
type
MyClass=class(TObject)
private
FA: integer;
protected
procedure SetA(Value:integer); //процедура запису
published
property A: integer read FA write SetA default true;
end;
Тут вводиться закрите поле FA, оголошується захищена функція SetA, що використовується для запису значення цього поля, і вводиться опублікована властивість А, яка оперує цим полем. В оголошенні властивості після ключового слова read записане просто ім’я поля. Це означає, що функція читання відсутня і користувач може безпосередньо читати знаення поля. Після ключового слова writeйде посилання на функцію запису SetA, за допомогою якої в поле А будуть записуватися нові значення. В цій функції можна передбачити якісь перевірки допустимості введеного значення А.
Опис цієї функції повинен поміщатися в розділ implementation модуля, в якому оголошений клас, і може мати вигляд
procedure MyClass.SetA(Value:integer);
begin
if…
then FA:=Value;
end;
В приведеному прикладі опис властивості А поміщений в розділ published. Отже, якщо цей клас описує створений нами новий компонент, то після його встановлення в системі властивість А з’явиться у вінкі Інспекторі Об’єктів при використанні цього компонента. Якщо перенести оголошення властивості в розділ public, то властивістю можна буде користуватися лише під час виконання програми, бо у вікні Інспектора Об’єктів воно не з’явиться. Якщо видалити з означення властивості слово writeз наступним посиланням на функцію запису, то властивість стане властивістю тільки для читання, оскільки поміняти її безпосередньо буде неможливо