Arrays Delphi-为什么使用VarArrayPut?
我正在使用Delphi Rio来控制Excel。我正在读写整个列,所以我使用VarArrayCreate创建一个变量数组来读取列的数据。我更新数据的特定部分,然后将更新写回变量数组。完成后,我将整个变量数组写回我的列 在数组中循环时,我读取数组中的单个元素。。。。并可能写回数组中的元素Arrays Delphi-为什么使用VarArrayPut?,arrays,delphi,variant,Arrays,Delphi,Variant,我正在使用Delphi Rio来控制Excel。我正在读写整个列,所以我使用VarArrayCreate创建一个变量数组来读取列的数据。我更新数据的特定部分,然后将更新写回变量数组。完成后,我将整个变量数组写回我的列 在数组中循环时,我读取数组中的单个元素。。。。并可能写回数组中的元素 ... read from the array CellText := arrData[i, 1]; ... possibly update data ... write the updated data b
... read from the array
CellText := arrData[i, 1];
... possibly update data
... write the updated data back to the array
arrData[i,1] := CellPadded;
这是毫无疑问的。我的问题与将更新写回数组有关。我遇到了VarArrayPut函数。为什么我要使用它,而不是像上面的代码那样直接将数据放回数组?简单的答案是
VarArrayPut
与数组访问器(方括号语法)相同,最后它们都在unitSystem.Variants中调用内部过程\u VarArrayPut
。同样,使用方括号或VarArrayGet
从数组中读取值将导致调用内部函数\u VarArrayGet
。通过进入(F7)赋值arrData[i,1]:=CellPadded,您可以轻松地检查自己代码>在调试会话期间
这就是说,变体数组访问器只是Delphi编译器提供的一种语法糖,可以使代码更短、更可读,但这是个人喜好的主题。考虑以下事项:
arrData[i, 1] := CellPadded;
{ vs }
VarArrayPut(arrData, CellPadded, [i, 1]);
如果您执行了大量数据操作,并且在处理过程中没有调整数组的大小,那么最好在。。通过绕过\u VarArrayGet
和\u VarArrayPut
内部执行的所有健全性检查和API调用直接访问阵列数据来获得一些额外性能:
{ untested, use at your own risk }
{$POINTERMATH ON}
var
Data: PVariant; { in case of variant array of varVariant }
LBound1, LBound2, HBound2: Integer;
Data := VarArrayLock(arrData);
try
LBound1 := VarArrayLowBound(V, 1);
LBound2 := VarArrayLowBound(V, 2);
HBound2 := VarArrayHighBound(V, 2);
{ access element value at [i, j] }
(Data + i - LBound1 + (j - LBound2) * (HBound2 - LBound2 + 1))^ := CellPadded;
{ ... }
finally
VarArrayUnlock(arrData);
end;
这当然不适用于锯齿阵列