Шаг 137.
Свойства со спецификатором index

    На этом шаге мы рассмотрим свойство со спецификатором 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. Результат работы приложения

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

    Отметим некоторые ограничения, которые накладывает использование индексного спецификатора на форму описания свойства:

    На следующем шаге мы рассмотрим видимость в классах.




Предыдущий шаг Содержание Следующий шаг