我继承了这段代码:
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,它在程序的其他地方用于相同的目的。
有没有更好的出路?
答案 0 :(得分:2)
SetLength
用于调整动态数组和长字符串的大小。要调整变体数组的大小,请使用VarArrayRedim
。
另一种选择是在TList<T>
类型的临时容器中构建元素列表。完成后,您可以使用该容器的Count
属性一次性调整变量数组的大小。然后,您将复制实际值。
我认为使用哪种方法几乎没有区别。