不能在变量数组上使用SetLength()

时间:2013-11-01 13:27:28

标签: arrays delphi variant

我继承了这段代码:

var
  FSavedRecords : Variant;  { actually, a private property in an ancestor }
  lFieldsArray  : Variant;
  lClientDataSet: TClientDataSet;

  FSavedRecords := VarArrayCreate([0, lCount], varVariant);

  for lRow := 0 to lCount do
  begin
    FSavedRecords[lRow] := VarArrayCreate([0, lClientDataSet.FieldCount-1], varVariant);
    with lClientDataSet do
      begin
        lFieldsArray := FSavedRecords[lRow];
        if <SomeCondition> then
           put lClientDataSet field values into lFieldsArray

由于条件并非总是如此,我最终在FSavedRecords中的元素少于lCount(+1)。
我当然可以计算(比如:lNrOutput),但是不能做SetLength(FSavedRecords,lNrOutput)('常量对象不能作为var参数传递')。

如果不能使用SetLength(),我假设我可以将变量数组转换为动态'变体数组'with DynArrayFromVariant并使用SetLength,但这具有额外复制操作的缺点。我想重新使用来自祖先形式的私有FSavedRecords,它在程序的其他地方用于相同的目的。

有没有更好的出路?

1 个答案:

答案 0 :(得分:2)

SetLength用于调整动态数组和长字符串的大小。要调整变体数组的大小,请使用VarArrayRedim

另一种选择是在TList<T>类型的临时容器中构建元素列表。完成后,您可以使用该容器的Count属性一次性调整变量数组的大小。然后,您将复制实际值。

我认为使用哪种方法几乎没有区别。