Создайте класс с этими свойствами, а затем присвойте вашему компоненту единственное свойство этого типа класса. Класс свойства должен быть TPersistent
потомком:
type
TComponentProperties = class(TPersistent)
private
function GetSomeValue: string;
function GetSomeValueExt: string;
published
property SomeValue: string read GetSomeValue;
property SomeValueExt: string read GetSomeValueExt;
end;
TMyComponent = class(TComponent)
private
FProperties: TComponentProperties;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Properties: TComponentProperties read FProperties;
end;
Компонент владеет своим объектом свойства, поэтому его необходимо создать и уничтожить:
constructor TMyComponent.Create;
begin
inherited;
FProperties := TComponentProperties.Create;
end;
destructor TMyComponent.Destroy;
begin
FProperties.Free;
inherited;
end;
С этим кодом свойства компонента теперь должны быть перечислены в пункте «Свойства». Это не категория . Категории это что-то совершенно другое. Категории не переупорядочивают компонент; они просто изменяют способ отображения в Инспекторе объектов. Обратите внимание, что с моим кодом TMyComponent
больше не имеет свойства SomeValue
. Вместо этого у него есть только одно свойство, Properties
и , что у объекта есть другие свойства. Подумайте, действительно ли вы хотите, чтобы потребители вашего компонента имели к нему доступ.
Если свойство Properties
не только для чтения, то оно должно иметь установщик свойства; Вы не можете написать это прямо в FProperties
. Напишите это так:
procedure TMyComponent.SetProperties(const Value: TProperties);
begin
FProperties.Assign(Value);
end;
Для этого также необходимо переопределить метод Assign
, чтобы поступить правильно:
procedure TComponentProperties.Assign(Other: TPersistent);
begin
if Other is TComponentProperties then begin
SomeValue := TComponentProperties(Other).SomeValue;
SomeValueEx := TComponentProperties(Other).SomeValueEx;
end else
inherited;
end;
Мы также предполагаем, что свойства объекта свойства также не доступны только для чтения. Когда свойства объекта свойства изменяются, объект-владелец, вероятно, захочет узнать об этом, поэтому у него должно быть событие, которому компонент присваивает значение. Когда свойства изменяются, они вызывают событие.