在 Linux 上的 Lazarus 中,我将一个类注册为一个组件,这样我就可以将它放到一个表单上。
就像一个魅力,除了我可以发布的属性仅限于简单类型,如字符串和整数。
每当我尝试发布像 TStringList 或 TImage 这样的属性时,当我在对象检查器中单击它时,它会引发“访问冲突”。
我将我的代码与标准组件进行了比较,但我看不出它们的不同之处。
那么在对象检查器中使用这些属性需要哪些额外的步骤呢?
在 Linux 上的 Lazarus 中,我将一个类注册为一个组件,这样我就可以将它放到一个表单上。
就像一个魅力,除了我可以发布的属性仅限于简单类型,如字符串和整数。
每当我尝试发布像 TStringList 或 TImage 这样的属性时,当我在对象检查器中单击它时,它会引发“访问冲突”。
我将我的代码与标准组件进行了比较,但我看不出它们的不同之处。
那么在对象检查器中使用这些属性需要哪些额外的步骤呢?
要发布一个类属性,您需要: 1. 在组件构造器中创建该属性 - 所以它永远不会为零 2. 在您的属性 Setter 中,您需要从新值分配给您的组件。所以你必须在你的组件中实现Assign方法或AssignTo。例如
TMyComponent = class
private
FString: TStrings;
published
property Strings: TStrings read FStrings write SetStrings;
end;
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// always create it in the constructor so it will not be nil
FStrings := TStringList.Create;
end;
procedure TMyComponent.SetStrings(const AValue: TStrings);
begin
// this is correct statement
FStrings.Assign(AValue);
// this is not correct
// FStrings := AValue;
end;
我认为这与 Delphi 中的大致相同,对于要在设计时使用的复杂类型,需要有处理显示/编辑它们的设计时代码。