我目前正在使用Vista下的CodeGear Delphi 2007。 我的应用程序在一些相当繁重的计算中返回内存不足错误。 .exe文件从150 Mb增长到惊人的2 Gb(!LOL)
关于这个问题:
1)我正在将一些数组改为arraylist 但它给了我一些相当难以解决的问题(见下面的示例)
2)建议使用多维结构并且要求代码中的细微变化是最受欢迎的!
现在处理会员的旧方式是:
function TResults.GetTriangleA(ComNr, triangleA, PtNr : integer) : single;
Begin
try
result := ListTriangleRes[TriangleA - 1].GetA(ComNr, PtNr);
还有TriangleResult类:
TTriangleRes = class(TResults)
private
IndexPoint1, IndexPoint2, Indexpoint3 : integer;
MyA : array of array [1..3] of single;
MyB : array of array [1..3] of single;
在这里,我正在尝试使用新的arraylist,但直到现在还不是很成功
function TResults.GetTriangleVz(ComNr, triangleA, PtNr : integer) : single;
Var
MyTriangleRes: TTriangleRes;
MyObj: Tobject;
begin
MyTriangleRes:= TTriangleRes.Create ;
try
MyObj := ListTriangleRes[TriangleA - 1] ;
result := MyObj <<<<?????? how to>>>>MyTriangleRes.GetVz(ComNr, PtNr);
Mkr
爱德华答案 0 :(得分:1)
据我所知,ArrayList是一个未在Delphi中使用的Java / C#集合。我们的等价物称为TObjectList。 (或者TList,但是如果你正在使用对象,最好使用TObjectList。)那是你正在使用的吗?我猜你是。
看起来您的问题在于对象类型。有两种方法可以从具有正确类型的列表中获取对象。您可以使用普通列表并对其进行类型转换,或者如果您有D2009或D2010,则可以使用通用列表。
第一种方法,使用TObjectList:
MyTriangleRes := ListTriangleRes[TriangleA - 1] as TTriangleRes; //type-safe cast
第二种方式:将ListTriangleRes声明为TObjectList<TTriangleRes>
,并将Generics.Collections添加到使用子句中。这使您在编译时而不是运行时类型安全,因为编译器将确保只有TTriangleRes对象进入和退出列表。
无论哪种方式,都不需要中间的TObject变量。
答案 1 :(得分:0)
我不确定你要做什么,但你的上一个代码不应该是MyTriangleRes:= ListTriangleRes [TriangleA-1],然后结果:= MyTriangleRes.GetVz(ComNr,PtNr)?