2

我定义了一个 Objectlist 来存储几个 Polygons 作为 TFPolygon = array of TPoint inside this TObjectList; 但是使用我的 objectlist 的 add 函数,我得到一个访问冲突错误:

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 数组的方法也有效?

4

1 回答 1

2

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

您将动态数组转换为Pointer. 此时,您已经对动态数组进行了新引用,但编译器不知道它,因为 aPointer不是托管类型。

您有几个选项可以解决您的问题。

  1. 如果您使用的是现代 Delphi,请停止使用TObjectList. 而是在Generics.Collections. 在你的情况下TList<TFPolygon>是你需要的。因为这是编译时类型安全的,所以托管类型的所有生命周期都得到了照顾。
  2. 如果您使用的是较旧的 Delphi,则可以将动态数组包装在一个类中。然后将这些类的实例添加到您的TObjectList. 确保您的列表配置为拥有其对象。您完全有可能在实现中进行包装,TFPolygonList这将很好地封装事物。
于 2013-03-27T14:57:05.267 回答