Delphi - 为什么使用 VarArrayPut?



我正在使用Delphi Rio来控制Excel。 我正在读取和写入整个列,所以我使用 VarArrayCreate 创建一个变体数组来读取列的数据。 我更新数据的特定部分,然后将更新写回 Variant 数组。完成后,我将整个 Variant 数组写回我的列。

在循环遍历数组时,我读取了数组的单个元素。并可能写回数组的该元素...

... 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与数组访问器(方括号语法(相同,最终它们都在单元System.Variants中调用内部过程_VarArrayPut。同样,使用方括号或VarArrayGet从数组中读取值将导致调用内部函数_VarArrayGet。通过在调试会话期间单步执行 (F7( 分配arrData[i, 1] := CellPadded;,可以轻松地自行检查。

也就是说,变体数组访问器只是 Delphi 编译器提供的一种语法糖,用于使代码更短、更具可读性,但这是个人品味的主题。请考虑以下事项:

arrData[i, 1] := CellPadded;
{ vs }
VarArrayPut(arrData, CellPadded, [i, 1]);

如果您进行了大量数据操作,并且在处理过程中没有调整数组的大小,则不妨在VarArrayLock中进行操作。VarArrayUnlock块,通过绕过_VarArrayGet_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;

这当然不适用于交错数组。

相关内容

  • 没有找到相关文章

最新更新