我想创建涉及类(而不是记录)的DynamicArrays的独立副本。我正在使用Delphi XE5。在下面的示例代码中,完成所有分配后,动态数组的所有副本都包含相同的值。在"Copy" does not create independent copy of Dynamic Array中已经解释过,由于涉及到课程,因此它是一种预期的行为。我遇到的问题是我不能避免使用类。类型定义由Delphi通过读入WSDL生成。它是一个巨大的文件,里面有近5000行。试图长时间修改类型定义是不可取的,并且会打开另一种蠕虫病毒。
TYPE
TX = class(TRemotable)
private
<..vars and functions..>
published
<..properties..>
end;
TArray_Of_TX = array of TX;
TDATA_RECORD = class(TRemotable)
private
<..vars and functions..>
public
destructor Destroy; override;
published
<..other properties..>
property Y: TArray_Of_TX Index (IS_OPTN or IS_UNBD) read FY write SetY stored ABooleanVariable;
end;
VAR
X: TArray_Of_TX;
DataRecord_1, DataRecord_2, DataRecord_3: TData_Record;
BEGIN
SetLength(X, 1);
X[0] := T_X_Type.Create();
X[0].var := 'some value 1';
DataRecord_1 := TData_Record.create();
DataRecord_1.Y := copy(X);
X[0].var := 'some value 2';
DataRecord_2 := TData_Record.create();
DataRecord_2.Y := copy(X);
X[0].var := 'some value 3';
DataRecord_3 := TData_Record.create();
DataRecord_3.Y := copy(X);
X[0].var := 'some value 4';
//At this time, I would like to have all copies of TArray_of_TX have different
//values for various member fields but they all have the same value--the last
//value assigned to X[0].var!
认为Copy()
不适用于类对象,我尝试setLength(DataRecord_1.Y, 1)
但它引发了编译错误"Constant object cannot be passed as var parameter".
一个简单的解决方案似乎是创建尽可能多的实例&#34; X&#34;根据需要变量,但问题是它可能是一个很大的数字(在设计时不知道)。除此之外,这将是非常低效和低效的。它还会引入自己的挑战,即跟踪使用哪个变量等等。
答案 0 :(得分:1)
您可以像这样复制数组:
function CloneArray(original: TArray_Of_TX): TArray_Of_TX;
var
i: integer;
copy: TX;
begin
Result.SetLength(SizeOf(original));
for i:= 0 to SizeOf(original) -1 do begin
copy:= TX.Create;
copy.assign(original[i]);
Result[i]:= copy;
end; {for i}
end;
此版本不使用泛型,因为我不确定如何使用动态数组创建通用版本。