Создание свойства-массива в компоненте

Свойства компонента могут быть практически любого типа, которые поддерживает язык Object Pascal. Некоторые свойства могут быть массивами. Яркими примерами свойств такого типа являются ТМеmо, Lines, TDBGrid. Columns и др. Подобные свойства требуют собственных редакторов. Мы пока остановимся на создании простого свойства, которое представляет из себя массив. Создадим новый компонент Tweek, содержащий два свойства: Month и Number. Свойство Month будет представлять собой массив, возвращающий название месяца по переданному целому числу от 1 до 12. Свойство Number – тоже массив, который возвращает число, соответствующее названию месяца.

Код компонента TWeek:

unit Week;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs;

type

TWeek = class(TComponent)

private

function GetMonthName (const AIndex: Integer): String;

function GetMonthNumber (const AMonthName: String): Integer;

protected

{ Protected declarations }

public

property MonthName[const AIndex: Integer]: String

read GetMonthName; default;

property MonthNumber[const AMonthName: String]: Integer

read GetMonthNumber;

published

{ Published declarations }

end;

procedure Register;

implementation

const

MonthNames: array[1..12] of String[8]= ('Январь', 'Февраль',

'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август',

'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');

function TWeek.GetMonthName(const AIndex: Integer): String;

begin

if (AIndex<=0) or (AIndex>12) then

raise Exception.Create('Номер месяца должен быть числом от 1 до

12')

else Result:= MonthNames[AIndex];

end;

function TWeek.GetMonthNumber(const AMonthName: String): Integer;

var i:integer;

begin

Result:=0;

for i:=l to 12 do

if AnsiUppercase(AMonthName)=AnsiUpperCase(MonthNames[i]) then

Result:=i;

end;

procedure Register;

begin

RegisterComponents('Samples', [TWeek]);

end;

end.

Рассмотрим вышеприведенный код более подробно. Как вы можете видеть, свойства типа Array объявляются вместе с индексами. Для свойства MontnName мы определили индекс AIndex, а для свойства MonthNumber - индекс AMonthName. Для доступа к свойствам такого типа необходимо использовать методы. Внутренних полей здесь нет. Если свойство типа Array многомерно, то свойство-массив объявляется сразу с несколькими индексами. При вызове методов доступа к ним нужно передавать параметры в том же порядке, в каком вы их указали в свойстве.

Функция GetMonthName возвращает строку, содержащую имя месяца, соответствующего целому числу от 1 до 12, переданному в качестве параметра данной функции. В случае передачи функции числа, не принадлежащему данному диапазону, будет сгенерировано исключение командой raise.

Функция GetMonthNumber возвращает число от 1 до 12, которое соответствует названию месяца, переданного в качестве параметра в данную функцию. В случае если ни один месяц не соответствует названию, определенному массивом MonthNames, результатом выполнения данной функции будет ноль.

Таким образом, если поместить на форму экземпляр компонента TWeek с именем Week1, при выполнении строки ShowMessage (Weekl.MonthName[5]); будет выдано окно с сообщением Май.

Команды Default и NoDefault

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

FMyProperty:= 10;

В результате чего, при каждом добавлении компонента на форму свойство MyProperty будет принимать значение 10.

Команды Default и NoDefault применяются для ускорения процесса загрузки формы при работе приложения. Например:

property MyCount: Integer read FMyCount write FmyCount Default 0;

Данный код не присваивает значение 0 свойству MyCount. При выполнении вышеприведенного кода команда Default 0 означает следующее: если при сохранении формы, содержащей компонент, значение свойства MyCount не будет равно нулю, то новое значение сохранится в файле формы, иначе значение данного свойства не будет сохранено.

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

Команда NoDefault предназначена для нейтрализации команды Default. Команда применяется для отмены команды Default компонентов-предков. Пример использования команды NoDefault:

TSecondComponent = class (TMyButton)

published

property MyCount NoDefault 0;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: