gpt4 book ai didi

delphi - 将TPoint数组存储在TObjectList中

转载 作者:行者123 更新时间:2023-12-03 18:37:35 26 4
gpt4 key购买 nike

我定义了一个对象列表来存储多个多边形,如TFPolygon = TPointList内的TPoint数组;但是使用我的对象列表的添加功能时,出现访问冲突错误


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

最佳答案

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

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

您有几种选择可以解决您的问题。


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

关于delphi - 将TPoint数组存储在TObjectList中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15661678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com