delphi 变体Variant数组常用操作

发布时间 2023-12-13 19:15:28作者: txgh

变体Variant数组常用操作

代码

procedure TForm1.Button1Click(Sender: TObject);
var
  Arr1, Arr2, Arr3: Variant;
  I, J: Integer;
begin
  //创建包含10个整数类型元素的变体数组
  Arr1 := VarArrayCreate([0, 9], varInteger);
  //创建2维数组,其中第1维是3个元素,第2维是5个元素
  Arr2 := VarArrayCreate([0, 2, 0, 4], varVariant);
  //创建并填充一维变体数组
  Arr3 := VarArrayOf([1, 1.23, 'a', 'b', 'c']);

  //判断是否是变体数组
  if VarArrayDimCount(Arr1) > 0 then
    Memo1.Lines.Add('是变体数组')
  else
    Memo1.Lines.Add('不是变体数组');

  //获取变体数组的维度
  Memo1.Lines.Add('Arr1维度 ' + IntToStr(VarArrayDimCount(Arr1)));
  Memo1.Lines.Add('Arr2维度 ' +IntToStr(VarArrayDimCount(Arr2)));
  Memo1.Lines.Add('Arr3维度 ' +IntToStr(VarArrayDimCount(Arr3)));

  //修改变体数组的长度
  VarArrayRedim(Arr1, 20);

  Memo1.Lines.Add('Arr1 Low ' + VarArrayLowBound(Arr1, 1).ToString + ' High ' + VarArrayHighBound(Arr1, 1).ToString);
  Memo1.Lines.Add('Arr2 一维 Low' + VarArrayLowBound(Arr2, 1).ToString + ' High ' + VarArrayHighBound(Arr2, 1).ToString);
  Memo1.Lines.Add('Arr2 二维 Low' + VarArrayLowBound(Arr2, 2).ToString + ' High ' + VarArrayHighBound(Arr2, 2).ToString);
  Memo1.Lines.Add('Arr3 Low' + VarArrayLowBound(Arr3, 1).ToString + ' High ' + VarArrayHighBound(Arr3, 1).ToString);

  //修改1维数组的内容(修改第2个元素和第3个元素)
  Arr1[1] := 1;
  Arr1[2] := 2;

  //修改多维数组的内容(修改[1,1]和[1,2]元素)
  VarArrayPut(Arr2, 'a', [1, 1]);
  VarArrayPut(Arr2, 'b', [1, 2]);

  //遍历1维变体数组的内容
  for I := VarArrayLowBound(Arr3, 1) to VarArrayHighBound(Arr3, 1) do
  begin
    Memo1.Lines.Add(I.ToString + '=' + VarToStr(Arr3[I]));
  end;

  //遍历多维变体数组的内容
  for I := VarArrayLowBound(Arr2, 1) to VarArrayHighBound(Arr2, 1) do
  begin
    for J := VarArrayLowBound(Arr2, 2) to VarArrayHighBound(Arr2, 2) do
    begin
      Memo1.Lines.Add(Format('[%d,%d]=%s', [I, J, VarToStr(VarArrayGet(Arr2, [I, J]))]));
    end;
  end;

  //清除变体数组
  VarClear(Arr1);
  VarClear(Arr2);
  VarClear(Arr3);
end;

方法

System.Variants.VarArrayCreate

function VarArrayCreate(const Bounds: array of Integer; AVarType: TVarType): Variant;

Unit

System.Variants

创建变体数组。无法创建数组,则会引发 EVariantArrayCreateError异常。

参数

Bounds 边界,必须包含偶数个值,其中每对值指定数组一个维度的上限和下限。

AVarType 元素类型。 不能包含 varArrayvarByRef ,不能是 varString 或自定义 Variant 类型。 要创建字符串变体数组使用 varOleStr 类型。 如果元素类型为 varVariant,则数组的元素本身就是变体,并且可以包含变体数组。

注意: 元素类型为 varByte 的变体数组是在 OLE 自动化控制器和服务器之间传递二进制数据的首选方法。 此类数组无需对其数据进行转换,并且可以使用 VarArrayLockVarArrayUnlock 例程进行高效访问。

System.Variants.VarArrayOf

function VarArrayOf(const Values: array of Variant): Variant;

Unit

System.Variants

创建并填充一维变体数组。

参数

Values 转换为数组元素的 Variant 值数组。

返回数组的下限为零,上限是 0参数给出的值的数量减一,元素类型为Variant

System.Variants.VarArrayDimCount

function VarArrayDimCount(const A: Variant): Integer;

Unit

System.Variants

返回变体数组的维数。 如果给定变体不是变体数组,则返回值为零。

System.VarArrayRedim

procedure VarArrayRedim(var A: Variant; HighBound: Integer);

Unit

System

将最右边维度的上限更改为值 HighBound 来调整变体数组 A 的大小。

保留数组中的现有元素,并将新元素设置为零或空。 如果 A 不是数组,或者没有足够的内存来调整数组大小,则会引发 EVariantArrayCreateError异常。

注意: 变体数组在锁定时无法调整大小。

System.Variants.VarArrayLowBound

function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;

Unit

System.Variants

返回给定变体数组中给定维度的下限。

参数

A 变体数组。

Dim 维度,对于最左边的,参数应为 1,对于第二个最左边的维度,参数应为 2,依此类推。

如果 A 不是数组则会引发 EVariantInvalidArgError 异常,Dim 指定的维度不存在,则会引发 EVariantBadIndexError 异常。

System.Variants.VarArrayHighBound

function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;

Unit

System.Variants

返回给定变量数组中给定维度的上限。

参数

A 变体数组。

Dim 维度,对于最左边的,参数应为 1,对于第二个最左边的维度,参数应为 2,依此类推。

如果 A 不是数组则会引发 EVariantInvalidArgError 异常,Dim 指定的维度不存在,则会引发 EVariantBadIndexError 异常。

System.Variants.VarArrayPut

procedure VarArrayPut(var A: Variant; const Value: Variant; const Indices: array of Integer);

Unit

System.Variants

设置多维变体数组中单个单元格的值。

参数

A 包含要设置的单元格的变体数组。

Value 要分配给指定单元格的值。

Indexs 索引值的数组。

如果 Indices 指定的值超出范围,则会引发 EVariantBadIndexError 异常。

System.Variants.VarArrayGet

function VarArrayGet(const A: Variant; const Indices: array of Integer): Variant;

Unit

System.Variants

获取多维变体数组中单个单元格的值。

参数

A 包含要获取的单元格的变体数组。

Indexs 索引值的数组。

如果 Indices 指定的值超出范围,则会引发 EVariantBadIndexError 异常。

System.VarClear

procedure VarClear(var V: Variant);

Unit

System

清空 Variant,使其处于未分配状态。

相当于将 Unsigned 常量分配给 V

调用 VarClear 后,VarIsEmpty 函数返回 true,VarType 函数返回 varEmpty。 在表达式中使用未分配的 Variant 变量会导致引发异常。 同样,如果尝试将未分配的 Variant 变量转换为另一种类型(使用 VarAsType ),则会引发异常。

注意: 未分配的VariantVarClear 使其未分配 )与分配 Null 值的Variant不同。值为Null的Variant可以在表达式中使用,并且可以转换为其他类型的Variant