arrays - Delphi - 为什么使用 VarArrayPut?

标签 arrays delphi variant

我正在使用 Delphi Rio 来控制 Excel。我正在阅读和编写整列,因此我正在使用 VarArrayCreate 创建一个变体数组来读取一列的数据值(value)。我更新数据的特定部分,然后将更新写回 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 中调用内部过程 _VarArrayPut .变种。同样,使用方括号或 VarArrayGet 从数组中读取值将导致调用内部函数 _VarArrayGet。在调试 session 期间,您可以通过 (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;

这当然不适用于锯齿状数组。

关于arrays - Delphi - 为什么使用 VarArrayPut?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61775411/

相关文章:

javascript - 按两个值对数组进行排序

arrays - 您如何表示算法中的大型矩阵以在调试时帮助您?

for循环中特定元素的Javascript数组组

multithreading - 线程加工的选择正确吗?

delphi - 对货币进行四舍五入

ios - 在 Swift 中存储数组并从数组中获取数据

delphi - 通过 TDownloadUrl (Delphi) 使用 session /cookie 下载网页

c++ - 如何将变体作为构造函数参数或函数参数传递

c++ - 优化 std::visit 可能吗?

c# - 如何从 C# 中的方法返回 VB6 Variant 类型的等效项