我在这个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数组的方法也有效?
答案 0 :(得分:2)
您的方法无效。动态数组是托管类型。它们的生命周期由编译器管理。为了实现这一点,你不能抛弃它们是托管类型的事实,这正是你所做的。
您将动态数组转换为Pointer
。此时您已对动态数组进行了新的引用,但编译器并未意识到它,因为Pointer
不是托管类型。
你有几个选择来解决你的问题。
TObjectList
。而是在Generics.Collections
中使用泛型类型安全容器。在您的情况下TList<TFPolygon>
就是您所需要的。因为这是编译时类型安全的,所以托管类型的所有生命周期都会得到处理。TObjectList
。确保将列表配置为拥有其对象。完全有可能在TFPolygonList
的实现中完全包装,这将很好地封装。