Свойства в Delphi могут быть простыми, перечислимыми, типа множество, объектными и массивами.
Простые свойства - это числовые, символьные и строковые типы данных. В инспекторе объектов для них не нужны специальные редакторы свойств.
unit OurComponent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TOurComponent = class(TComponent) private FMyInteger: Integer; FMyChar: Char; FMyString: string; procedure SetMyInteger(const Value: Integer); procedure SetMyChar(const Value: Char); procedure SetMyString(const Value: string); { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } property MyInteger: Integer read FMyInteger write SetMyInteger; property MyChar: Char read FMyChar write SetMyChar; property MyString: string read FMyString write SetMyString; end; procedure register; implementation procedure register; begin RegisterComponents('Samples', [TOurComponent]); end; { TOurComponent } procedure TOurComponent. SetMyChar(const Value: Char); begin FMyChar := Value; end; procedure TOurComponent. SetMyInteger(const Value: Integer); begin FMyInteger := Value; end; procedure TOurComponent. SetMyString(const Value: string); begin FMyString := Value; end; end.
Перечислимые свойства - это стандартные перечислимые, логический и определенные пользователем перечислимые типы данных. В инспекторе объектов для них редакторы свойств отображаются в виде списка выбора (combobox).
unit OurComponent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TMyEnumerate = (meFirst, meSecond, meThird); TOurComponent = class(TComponent) private { Private declarations } FMyBoolean: Boolean; FMyCursor: TCursor; FMyEnumerate: TMyEnumerate; procedure SetMyCursor(const Value: TCursor); procedure SetMyBoolean(const Value: Boolean); procedure SetMyEnumerate(const Value: TMyEnumerate); protected { Protected declarations } public { Public declarations } published { Published declarations } property MyCursor: TCursor read FMyCursor write SetMyCursor; property MyBoolean: Boolean read FMyBoolean write SetMyBoolean; property MyEnumerate: TMyEnumerate read FMyEnumerate write SetMyEnumerate; end; procedure register; implementation procedure register; begin RegisterComponents('Samples', [TOurComponent]); end; { TOurComponent } procedure TOurComponent.SetMyCursor(const Value: TCursor); begin FMyCursor := Value; end; procedure TOurComponent.SetMyEnumerate(const Value: TMyEnumerate); begin FMyEnumerate := Value; end; procedure TOurComponent.SetMyBoolean(const Value: Boolean); begin FMyBoolean := Value; end; end.
Свойства типа множество - это стандандартные, а также определенные пользователем, множества. В инспекторе объектов для них редакторы свойств имеют знак [+] перед названием свойства.
Размер публикуемых (published) свойств ограничен 32 элементами. Если вам необходимо свойство с более чем 32 элементами - объявите свое свойство публичным (public).
unit OurComponent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TMySet = (msOne, msTwo, msThee, msFour, msFive); TMySets = set of TMySet; TOurComponent = class(TComponent) private { Private declarations } FMySet: TMySets; procedure SetMySet(const Value: TMySets); protected { Protected declarations } public { Public declarations } published { Published declarations } property MySet: TMySets read FMySet write SetMySet; end; procedure register; implementation procedure register; begin RegisterComponents('Samples', [TOurComponent]); end; { TOurComponent } procedure TOurComponent.SetMySet(const Value: TMySets); begin FMySet := Value; end; end.
Объектные свойства - это стандартные (TFont, TCanvas и т.п.) или определенные пользователем объекты, как правило наследники TPersistent. В инспекторе объектов для них редакторы свойств имеют знак [+] перед названием свойства и кнопку с тремя точками [...](пользовательский редактор свойства).
unit OurComponent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TOurComponent = class(TComponent) private { Private declarations } FMyFont: TFont; procedure SetMyFont(const Value: TFont); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property MyFont: TFont read FMyFont write SetMyFont; end; procedure register; implementation procedure register; begin RegisterComponents('Samples', [TOurComponent]); end; { TOurComponent } constructor TOurComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); {В отличие от предыдущих свойств, объекты обязательно необходимо создавать в конструкторе компонента, как правило после вызова унаследованного конструктора} FMyFont.Create; end; destructor TOurComponent.Destroy; begin FMyFont.Free; {В отличие от предыдущих свойств, объекты обязательно необходимо разрушать в деструкторе компонента, как правило перед вызовом унаследованного деструктора} inherited Destroy; end; procedure TOurComponent.SetMyFont(const Value: TFont); begin {Объектному свойству значение присваивается с помощью вызова метода Assign} FMyFont.Assign(Value); end; end. На заметку: Перемещение между объявлением метода и реализацией происходит по нажатию клавиш Ctrl + Shift + стрелки вверх/вниз.
Свойства типа масив - обычные массива Object Pascal, но в отличии от последних могут индексироваться не только числовыми значениями но и строковыми. К сожалению этот тип свойства требует пользовательского редактора свойств (в инспекторе объектов редактор свойства имеет кнопку с тремя точками [...]), по-этому в указанном ниже примере свойство ArrayProp объявлено в секции public.
type TOurComponent = class(TComponent) private { Private declarations } FArrayProp: array[0..9] of integer; function GetArrayProp(aIndex: integer): integer; procedure SetArrayProp(aIndex: integer; const Value: integer); protected { Protected declarations } public { Public declarations } property ArrayProp[aIndex: integer]: integer read GetArrayProp write SetArrayProp; published { Published declarations } end;
Спецификаторы свойств
Спецификатор default указывает сохранять значение свойства в файле формы или нет. Если значение свойства совпадает со значением default - значение в файле формы не сохраняется, если значения не равны - сохраняется. Это можно проверить, положив компонент на форму и выбрать правой кнопкой мыши пункт меню "View as Text". Default не устанавливает первоначальное значение свойства к указанному. Это необходимо сделать в конструкторе компонента.
unit OurComponent; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls; type TOurComponent = class(TComponent) private { Private declarations } FMyInteger: Integer; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property MyInteger: Integer read FMyInteger write FMyInteger default 10; end; implementation constructor TOurComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); FInteger := 10; end; end.
Спецификатор nodefault отменяет заданное по умолчанию значение свойства. Этот спецификатор, как правило, используется для отмены заданого по умолчанию значения унаследованного свойства. Например: property AutoSize nodefault; Спецификатор stored указывает когда сохранять в файле формы значение свойства. После stored может стоять true (всегда сохранять), false (никогда не сохранять) или название функции, которая возвращает логический результат.
property OneProp: integer read FOneProp write SetOneProp stored False; property TwoProp: integer read FTwoProp write SetTwoProp stored True; property ThreeProp: integer read FThreeProp write SetThreeProp stored Fuct;
На заметку: Выделять прямоугольный фрагмент текста в редакторе исходного кода можно с помощью комбинации клавиш Alt + Shift + стрелки вверх/вниз.