-
Создание перечислимого свойства и свойства-множества
Перечислимые свойства принадлежат перечислимому или логическому типам и позволяют выбрать одно значение из предлагаемого списка. Например, Align или Visible. Свойства, принадлежащие к множественному типу, позволяют задать любую комбинацию из предлагаемого набора. Например, BorderStyle или Anchors.
Добавление перечислимого (логический тип рассматривается как перечислимый) или множественного свойства осуществляется аналогично добавлению простого свойства.
Пример. Создание перечислимого свойства и свойства-множества.
type
TWeekDay=(wdMonday, wdTuesday, wdWednesday, wdThursday,wdFriday,
wdSaturday, wdSunday);
TArrow=Set of (arTop, arBottom, arLeft, arRight);
TMyButton = class(TButton)
private
{ Private declarations }
FMyInteger: integer;
FMyChar: Char;
FMyString: string;
FWeekday: TWeekDay;
FArrow: TArrow;
FMyCursor: TCursor;
FMyAnchors: TAnchors;
protected
{ Protected declarations }
public
{ Public declarations }
property MyInteger: integer read FMyInteger write FMyInteger;
property MyChar: char read FMyChar write FMyChar;
property MyString: char read FMyString write FMyString;
property MyAnchors: char read FMyAnchors write FMyAnchors;
published
{ Published declarations }
property Weekday: TWeekday read FWeekday write FWeekday;
property MyCursor: TCursor read FMyCursor write FMyCursor;
property Arrow: TArrow read FArrow write FArrow;
end;
Множественное свойство Anchor (якорь)
Перечислимое свойство Weekday.
Перечислимое свойство MyCursor.
Все свойства доступны для чтения и записи. Программно доступны только свойства Weekday и MyCursor, описанные в разделе общедоступных описаний (Published).
-
Создание свойства-объект
Свойства-объекты содержат другие свойства. Например, свойством-объектом является свойство Font. Значение этих свойств можно изменять с помощью Инспектора объектов, возможно и создание специального редактора.
Свойство-объект можно создать на основе типа какого-либо объекта. Описание типа объекта представляет собой описание класса, предком которого является класс TPersistent и его потомки.
Перед использованием нового объекта он должен быть предварительно создан, а после использования удален.
Добавим в компонент свойство-объект MyObject.
TMyObject = class(TPersistent)
private
{ Private declarations }
FObjectNumber: integer;
FObjectAttrib: boolean;
FObjectName: string;
protected
{ Protected declarations }
public
{ Public declarations }
published
property ObjectNumber: integer read FObjectNumber write FObjectNumber;
property ObjectAttrib: boolean read FObjectAttrib write FObjectAttrib;
property ObjectName: string write FObjectName;
end;
TMyButton = class(TButton)
private
{ Private declarations }
FMyObject: TMyObject;
FCode2: integer;
function GetCode2 : integer;
procedure SetCode2 (pCode2: integer);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create (AOwner: TComponent); override; { override – отвергать}
destructor Destroy; override;
published
{ Published declarations }
property MyObject: TMyObject read FMyObject write FMyObject;
property Code2: integer read GetCode2 write SetCode2;
end;
procedure Register;
implementation
constructor TMyButton.Create (AOwner : TComponent);
Begin
inherited; {Inherited – Используется для вызова родительского класса конструктора или метода деструктора}
FMyObject:= TMyObject.Create
End;
destructor TMyButton.Destroy;
Begin
FreeAndNil(FMyObject);
inherited;
End;
function TBtnSound1.GetCode2 : integer;
begin
If FCode2>0 Then Result:=FCode2 else Result:=0;
end;
procedure TBtnSound1.SetCode2 (pCode2: integer);
begin
If FCode2<>pCode2 then FCode2:=pCode2;
end;
В конструкторе класса TMyButton после создания объекта этого класса создается объект TMyObject, а в деструкторе класса TMyButton перед удалением объекта этого класса удаляется объект TMyObject.
Свойства-массивы содержат индексированную совокупность однотипных значений. Например, свойство Lines. Значения этих свойств можно изменять только с помощью специального редактора.
unit Week; interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TWeek = class(TComponent)
private
{ Private declarations }
function GetMonthName (const AIndex: Integer): String;
function GetMonthNumber (const AMonthName: String): Integer;
protected
{ Protected declarations }
public
{ Public declarations }
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:=1 to 12 do begin
if Uppercase(AMonthName)=UpperCase(MonthNames[i]) then
Result:=1;
end;
end;
procedure Register;
begin
RegisterComponents('Samples', [TWeek]);
end;
end.
Пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=Week1.MonthName[MonthOf(Date)]
end;