На этом шаге мы рассмотрим свойство со спецификатором index.
Если посмотреть на синтаксис свойств, то можно заметить, что осталось нерассмотренным использование еще одного спецификатора.
Это спецификатор index, который называется индексным спецификатором. Сразу отметим, что свойства с индексным спецификатором и свойства-массивы - это понятия разные.
Такие свойства являются особым случаем свойств и могут использоваться для тех же целей, что и свойства-массивы, но выглядят иногда более привлекательно.
Приведем пример использования свойств с индексным спецификатором.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; Masks = class private FMasks: array[1..3] of Word; function GetMask(Index: Integer): Word; procedure SetMask(Index: Integer; Value: Word); public property MaskForTask1: Word index 1 read GetMask write SetMask; property MaskForTask2: Word index 2 read GetMask write SetMask; property MaskForTask3: Word index 3 read GetMask write SetMask; end; var Form1: TForm1; MyMasks: TMasks; implementation {$R *.dfm} function TMasks.GetMask; begin Result := FMasks [Index] end; procedure TMasks.SetMask; begin FMasks[Index] := Value end; procedure TForm1.FormCreate(Sender: TObject); var St : String; i : Integer; begin MyMasks := TMasks.Create; Memo1.Lines.Clear; with MyMasks do begin MaskForTask1 := 10; MaskForTask2 := 5; MaskForTask3 := MaskForTaskl and MaskForTask2; { Последний оператор присваивания эквивалентен оператору } { SetMask (3, GetMask(l) and GetMask (2)); } { Вывод значений масок в поле Memol } St := 'MaskForTask1 = '+IntToStr(MaskForTask1); Memo1.Lines.Add(St); St := 'MaskForTask2 = '+IntToStr(MaskForTask2); Memo1.Lines.Add(St); St := 'MaskForTask3 = '+IntToStr(MaskForTask3); Memo1.Lines.Add(St); end; end; end.
Текст этого примера можно взять здесь.
Результат:
Рис.1. Результат работы приложения
Как видно из примера, несколько различных свойств, имеющих уникальные имена, используют одни и те же методы чтения и записи для доступа к разным элементам одного и того же поля-массива.
Другими словами, происходит автонастройка методов доступа, в зависимости от того, какое свойство они обслуживают в данный момент.
Отметим некоторые ограничения, которые накладывает использование индексного спецификатора на форму описания свойства:
- в описании спецификаторов доступа read и write, аналогично свойствам-массивам, могут быть указаны только идентификаторы методов.
Прямое использование идентификатора поля запрещено; - методы чтения и записи свойства должны иметь дополнительный параметр-значение типа Integer для передачи индекса;
- в методе чтения дополнительный индексный параметр должен быть последним в списке передаваемых параметров;
- в методе записи дополнительный индексный параметр должен непосредственно предшествовать параметру, определяющему новое значение свойства;
- при обращении к свойству, индекс, определяемый спецификатором index, автоматически передается дополнительному параметру в качестве фактического параметра;
- константа, стоящая за директивой index, должна быть целого типа и иметь значение от -32767 до 32767.
На следующем шаге мы рассмотрим видимость в классах.