制作动态数组类的独立副本

时间:2014-05-03 16:43:23

标签: delphi

我想创建涉及类(而不是记录)的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;根据需要变量,但问题是它可能是一个很大的数字(在设计时不知道)。除此之外,这将是非常低效和低效的。它还会引入自己的挑战,即跟踪使用哪个变量等等。

1 个答案:

答案 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;

此版本不使用泛型,因为我不确定如何使用动态数组创建通用版本。