首页 > 其他分享 >delphi 变体Variant数组常用操作

delphi 变体Variant数组常用操作

时间:2023-12-13 19:22:52浏览次数:27  
标签:delphi Variant System Arr2 数组 变体 Variants

变体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

标签:delphi,Variant,System,Arr2,数组,变体,Variants
From: https://www.cnblogs.com/txgh/p/17899750.html

相关文章

  • pure::variants—产品平台化及变体管理工具
    产品概述    pure::variants是德国pure-systems公司的产品,其目的是帮助企业实现对产品线的变体管理,提高企业项目资产的复用效率。pure::variants的核心理念是运用产品线管理方法对项目资产(项目计划、需求、模型、功能模块、代码、测试用例)进行系统的复用管理,将管理的关注......
  • delphi 提示 Access violation at address 014CA924 in module 'EBD.exe'. Read of ad
    通过类似Accessviolationataddress014CA924inmodule'EBD.exe'.Readofaddress0D1A0000提示查看代码出错的行。1、开启map project -> options -> Linker -> Map file 选择detailed2、查看ImageBase 3、计算地址崩溃行偏移 = 崩溃地址(Crash Addre......
  • 神秘文字的编码与变体
    一、火星文的起源与演变火星文,是一种源于台湾地区的网络文字。它由同音字、注音符号、拼成样子的字母等非正规化文字符号组合而成。乍看之下,火星文像是乱码或打错的字,用法也不同于汉字那么规范。那么,这种看似杂乱无章的文字是如何编码和演变出来的呢?火星文生成器--一个覆......
  • 5、QVariant
    QVariant,被称为万能数据类型,实际上它是类似C++的联合union类型。简单的说自定义性能强就像一个盒子几乎可以让你放任意的qt类型,同时可以轻松构造任意类型的任意复杂数据结构,但请注意复杂类型意味着性能和效率的让步。qt6在文档中如下描述:由于C++禁止联合union包含具有非默认构......
  • delphi实现点击列头按隐藏列排序方法
    场景:某字段应为数字但由于历史原因被定义为字符串,点击需按数字的要求进行排序实现原理:判断如果是点击某一列头则调用一次查询,通过传排序规则给后台,由后台将排好序的结果返回给前台实现办法:采用onclicktitle方法第一步,保存当前排序规则sSortFieldName:= gdQuery.SortMarkedCol......
  • C++17 更通用的 union:variant
    References现代C++学习——实现多类型存储std::variant如何优雅的使用std::variant与std::optionalstd::variant是C++17中,一個新加入標準函式庫的template容器;他的概念基本上是和union(參考)一樣,是一個可以用來儲存多種型別資料的容器。比如說:std::variant<int,d......
  • Delphi模拟鼠标点击
    1var2FindW:HWND;3begin4findw:=FindWindow(nil,'欢迎使用百度网盘');5sendmessage(FindW,messages.WM_LBUTTONDOWN,0,$00250107);6sendmessage(FindW,messages.WM_LBUTTONUP,0,$0015043D);7end; HWNDFindWindow(  LPCTSTRlpClassName, //通过查找窗口......
  • delphi 遍历集合类型
    遍历集合类型代码通过for-in循环遍历usesSystem.TypInfo;procedureTForm1.Button1Click(Sender:TObject);varvAnchors:TAnchors;vAnchor:TAnchorKind;beginvAnchors:=[akLeft,akTop,akBottom];forvAnchorinvAnchorsdobeginMemo1.Lines.......
  • 关于Delphi
    #关于Delphi··Delphi中使用的面向对象pascal编程语言。··Pascal语言最初由瑞士苏黎士理工学院的尼古拉斯-沃斯(NiklausWirth)教授在1971年设计。··1983年Borland公司推出了世办闻名的Pascal编译器--TurboPascal,成为当时最畅销的编译器之一、··随着TurboPascal编......
  • Delphi获取当前系统时间(使用API函数GetSystemTime)
    在开发应用程序时往往需要获取当前系统时间。尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题。在《融会贯通--Delphi4.0实战技巧》(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨......