在TObjectList中存储TPoint数组

时间:2013-03-27 14:41:21

标签: delphi

我在这个TObjectList中定义了一个Objectlist来存储多个多边形作为TFPolygon = TPoint数组;但是使用我的objectlist的add函数,我得到了一个Access违规错误 :

type
  TFPolygon = array of TPoint;
  TFPolygonList = class(TObjectList)
  private
    procedure SetPolygon(Index: Integer; Value: TFPolygon);
    function GetPolygon(Index: Integer): TFPolygon;
  public
    procedure Add(p: TFPolygon);
    property Items[index: Integer]: TFPolygon read GetPolygon write SetPolygon; default;
  end;

implementation

procedure TFPolygonList.SetPolygon(Index: Integer; Value: TFPolygon);
begin
  inherited Items[Index] := Pointer(Value);
end;

function TFPolygonList.GetPolygon(Index: Integer): TFPolygon;
begin
  Result := TFPolygon(inherited Items[Index]);
end;

procedure TFPolygonList.Add(p: TFPolygon);
begin
  inherited Add(Pointer(p));
end;

我无法理解此代码示例中的错误?我可以只将类存储在TObjectList中,还是我存储TPoints数组的方法也有效?

1 个答案:

答案 0 :(得分:2)

您的方法无效。动态数组是托管类型。它们的生命周期由编译器管理。为了实现这一点,你不能抛弃它们是托管类型的事实,这正是你所做的。

您将动态数组转换为Pointer。此时您已对动态数组进行了新的引用,但编译器并未意识到它,因为Pointer不是托管类型。

你有几个选择来解决你的问题。

  1. 如果您使用的是现代Delphi,请停止使用TObjectList。而是在Generics.Collections中使用泛型类型安全容器。在您的情况下TList<TFPolygon>就是您所需要的。因为这是编译时类型安全的,所以托管类型的所有生命周期都会得到处理。
  2. 如果您使用的是较旧的Delphi,则可以将动态数组包装在类中。然后将这些类的实例添加到TObjectList。确保将列表配置为拥有其对象。完全有可能在TFPolygonList的实现中完全包装,这将很好地封装。