【问题标题】:Publishing a property in a Lazarus component raises an 'Access violation'在 Lazarus 组件中发布属性会引发“访问冲突”
【发布时间】:2010-01-25 05:35:57
【问题描述】:

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

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

我将我的代码与标准组件进行了比较,但我看不出它们的不同之处。

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

【问题讨论】:

    标签: properties components lazarus


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你能给我指出一些关于这个的文档吗?到目前为止,我阅读的所有文档都没有提到有关复杂类型的特殊处理的任何内容。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多