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

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

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

  • в описании спецификаторов доступа read и write, аналогично свойствам-массивам, могут быть указаны только идентификаторы методов.
    Прямое использование идентификатора поля запрещено;
  • методы чтения и записи свойства должны иметь дополнительный параметр-значение типа Integer для передачи индекса;
  • в методе чтения дополнительный индексный параметр должен быть последним в списке передаваемых параметров;
  • в методе записи дополнительный индексный параметр должен непосредственно предшествовать параметру, определяющему новое значение свойства;
  • при обращении к свойству, индекс, определяемый спецификатором index, автоматически передается дополнительному параметру в качестве фактического параметра;
  • константа, стоящая за директивой index, должна быть целого типа и иметь значение от -32767 до 32767.

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий