目前我认为您的代码有问题的是:
- 属性设置器必须接收与属性相同类型的单个参数,即
TMyClass
.
- 属性设置器必须是该类的成员,但您已将其实现为独立过程。
- 发布的属性需要有一个 getter。
所以代码会变成:
type
TMyClass = class
Name: string;
Number: double;
end;
TMyComponent = class(TCustomPanel)
private
FMyClass: TMyClass;
procedure SetMyClass(Value: TMyClass);
published
property MyClass: TMyClass read FMyClass write SetMyClass;
end;
procedure TMyComponent.SetMyClass(Value: TMyClass);
begin
FMyClass.Name:= Value.Name;
FMyClass.Number:= Value.Number;
end;
此代码不实例化FMyClass
. 我猜想实例化的FMyClass
代码是为了这个问题而被删除的较大组件代码的一部分。但显然你确实需要实例化FMyClass
.
实例化的另一种方法FMyClass
是TMyClass
变成记录。这是否适合您的需求,我无法确定。
看起来您在实例化此对象时遇到了一些问题。像这样做:
type
TMyClass = class
Name: string;
Number: double;
end;
TMyComponent = class(TCustomPanel)
private
FMyClass: TMyClass;
procedure SetMyClass(Value: TMyClass);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property MyClass: TMyClass read FMyClass write SetMyClass;
end;
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FMyClass:= TMyClass.Create;
end;
destructor TMyComponent.Destroy;
begin
FMyClass.Free;
inherited;
end;
procedure TMyComponent.SetMyClass(Value: TMyClass);
begin
FMyClass.Name:= Value.Name;
FMyClass.Number:= Value.Number;
end;
最后一条评论。用于MyClass
对象是一个坏名字。使用类作为类型,使用对象作为实例。所以,你的属性应该是MyObject
,成员字段应该是FMyObject
等。