在Lazarus组件中发布属性会引发“访问冲突”

时间:2010-01-25 05:35:57

标签: properties components lazarus

在Linux上的Lazarus中,我将一个类注册为一个组件,以便我可以将它放在一个表单上。

像魅力一样工作,除了我可以发布的属性仅限于字符串和整数等简单类型 每当我尝试发布类似TStringList或TImage的属性时,当我在对象检查器中单击它时会引发“访问冲突”。

我将我的代码与标准组件进行了比较,但我看不出他们在做什么不同。

那么在对象检查器中使用这些属性需要执行哪些额外步骤?

2 个答案:

答案 0 :(得分:2)

要获得类属性,您需要: 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;

答案 1 :(得分:0)

我认为这与Delphi大致相同,对于要在设计时使用的复杂类型,需要设计时代码来处理显示/编辑它们。