Свойство типа массив может принимать любой тип данных, определенный в Инспекторе объектов, и обозначается в Инспекторе объектов кнопкой с многоточием (например, свойства Items, Lines). В них списки строк хранятся в массивах, доступ к которым обеспечивается известными методами языка Delphi.
Первым шагом для создания свойства-массива в новом компоненте должно стать объявление массива с указанием его имени, количества элементов и типа хранимых данных, например:
type TMyIntArray = Array [0..9] of integer;
Далее в секции private описывается внутреннее поле fMyIntArray компонента типа TMyIntArray. Но затем обычная последовательность описания свойств будущего компонента нарушается. Это связано с тем что, Инспектор объектов не приспособлен к отображению свойств типа массив. Поэтому попытка разместить такое свойство в секции published не принесет никаких результатов.
Ответ на вопрос о том, каким образом в Инспекторе объектов оказывается свойство-массив (например, Lines у компонента ТМеmо), можно найти в справочной системе Delphi, в разделах, посвященных созданию редактора свойств и редактора компонента. Обычно доступ к полю реализуется в секции public:
type
TMyComponent = class(TCustomControl)
private
fMyIntArray:TMyIntArray;
protected
function GetMyArrayUnit(ind : Integer) :Integer;
procedure SetMyArrayUnit(ind, value : Integer);
public
property MyArrayUnit[ind:Integer]:Integer read GetMyArrayUnit write
SetMyArrayUnit;
published
end;
…
implementation
…
function TMyComponent.GetMyArrayUnit(ind:Integer):Integer;
begin
// Чтение элемента с индексом ind из массива
Result:=fMyIntArray[ind];
end;
procedure TMyComponent.SetMyArrayUnit(ind,value:Integer);
begin
// Запись значения value в элемент массива с индексом ind
fMyIntArray[ind]:=value;
end;
В этом примере чтение из массива обеспечивается функцией GetMyArrayUnit(ind:Integer): Integer, а запись в массив - процедурой SetMyArrayUnit(ind, value:Integer)5 . В качестве параметра в обоих методах обязательно присутствует индекс элемента в массиве - ind.
Таким образом, при создании свойства типа массив оно объявляется в секции public. Для организации доступа к элементам массива необходимо описание как минимум двух внутренних методов компонента, отвечающих соответственно за чтение и запись в массив.
Свойствами-массивами не поддерживаются спецификаторы памяти, а директива default при описании свойства-массива имеет другое назначение [2].
Если свойство создается на основе многомерного массива, то последовательность индексов в методах доступа должна точно соответствовать очередности объявления индексов у свойства.
Сноски:
5 Согласно существующим соглашениям имена процедур, отвечающих за запись значений в поле, должны начинаться с приставки Set, а имена функций, обеспечивающих чтение, - с приставки Get. Вторая часть имени включает название свойства, с которым работают эти методы, например SetMyArrayUnit(), GetMyArrayUnit().
|