Delphi - 为啥使用 VarArrayPut?
Posted
技术标签:
【中文标题】Delphi - 为啥使用 VarArrayPut?【英文标题】:Delphi - Why Use VarArrayPut?Delphi - 为什么使用 VarArrayPut? 【发布时间】:2020-05-13 13:04:48 【问题描述】:我正在使用 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。为什么我要使用它而不是像上面的代码那样直接将数据放回数组中?
【问题讨论】:
【参考方案1】:简单的答案是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;
这当然不适用于锯齿状数组。
【讨论】:
以上是关于Delphi - 为啥使用 VarArrayPut?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Delphi 10.4.1(最新)中不使用 Detours 安装 Vcl.Styles (RRUZ)
Delphi:使用调试器调用 C dll 函数需要 15 秒,而没有调试器需要 0.16 秒。为啥?
delphi的 ToolBar1控件增加个按扭,为啥在CAPTION属性上写字不显示呢》
我在Delphi 7 中,使用TMS第三方的控件包,为啥保存后再打开就出错?