1

我继承了这段代码:

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(),我假设我可以使用 DynArrayFromVariant将变量数组转换为动态的“变量数组”并在其上使用 SetLength,但这具有额外复制操作的缺点。我想重新使用祖先表单中的私有 FSavedRecords,它在程序的其他地方用于相同的目的。

有没有更好的出路?

4

1 回答 1

2

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

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

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

于 2013-11-01T13:54:08.800 回答