转自:Delphi中的变体Variant数组相关函数

1.VarArrayCreate

procedure TForm1.Button1Click(Sender: TObject); 
var 
  V, W : Variant; 
  i : Integer; 
begin 
  V := VarArrayCreate([1,4], varVariant); 
  V[1] := 1; 
  V[2] := '2'; 
  V[3] := True; 
  V[4] := 4.5;

for i := VarArrayLowBound(V, 1) to VarArrayHighBound(V, 1) do 
  begin 
    Memo1.Lines.Add(V[i]) 
  end;

W := VarArrayCreate([1,2, 1,3], varInteger);      //二维

end;

注:数组上下线取值函数不能使用Low/High,而是VarArrayLowBound/VarArrayHighBound,其第二个参数为数组维数。

2.VarArrayOf

更快捷的创建变体数组的函数,例如:V := VarArrayOf([1, '2', True, 4.5]);

3.VarArrayRedim

调整变体数组上下限

4.VarArrayDimCount

范围变体数组维数

5.VarArrayLowBound/VarArrayHighBound

返回变体数组上/下限

6.VarArrayLock/VarArrayUnlock

避免运行时刻检查。一般用于初始化一个大数组。

例如:假设已经存在大数组A,现试图复制该数组时使用如下代码:

V := VarArrayCreate([1, 10000], varByte); 
  for i := 1 to 10000 do 
    V[i] = A[i];

但是这段代码的性能是有问题的,这样会把大量的时间花费在对Variant数组的初始化上,因为在对每一个元素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避免运行时检查,要用VarArrayLock()函数和VarArrayUnlock()过程。arArrayLock()函数在内存中锁定数组,使数组不再移动和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程 
用来对VarArrayLock()函数锁定的数组进行解锁,使数组能重新移动或改变大小。在锁定数组后,能用更有效的方法对数组进行初始化,例如用指向数组数据的指针调用Move()过程,下面的代码也对Variant数组进行初始化,但它更有效:

begin 
  v:=VarArrayCreate([1,10000],varBate); 
  p:=VarArrayLock(v) 
  try 
    move(A,P^,10000); 
  finally 
    VarArrayUnlock(v); 
  end; 
end;

7.VarArrayRef

获得variant指向的数据

8.VarIsArray

函数是一个简单的布尔检查函数,如果传递给它的参数是一个Variant数组则返回True,否则返回False.


1.VarArrayCreate()和VarArrayOf()这两个常用就不说了 
2.VarArrayRedim()函数能修改variant数组的最高限。 
3.VarArrayDimCount()函数返回Variant数组的维数, 
4.VarArrayLowBound()和VarArrayHighBound()函数分别返回Variant数组的下边界和上边界。 
5.VarArrayLock()和VarArrayUnlock()一般用于初始化一个大数组。 
如: 
它创建一个有10000字节的Variant数组。假定有另一个相同长度的非Variant类型的数组,并且想 
把非variant类型的数组复制到variant类型的数组中去。通常这都是通过用循环语句对variant数组 
的单元进行赋值实现的。示例如下: 
begin 
v:=VarArrayCreate([1,10000],varBate); 
fori:=1to10000do 
v[i]:=a[i]; 
end; 
上面这段代码的主要问题在于,大量的时间花费在对Variant数组的初始化上,因为在对每一个元 
素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避 
免运行时检查,要用VarArrayLock()函数和VarArrayUnlock()过程。VarArrayLock()函数在内存中锁 
定数组,使数组不再移动和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程 
用来对VarArrayLock()函数锁定的数组进行解锁,使数组能重新移动或改变大小。在锁定数组后,能 
用更有效的方法对数组进行初始化,例如用指向数组数据的指针调用Move()过程,下面的代码也对 
Variant数组进行初始化,但它更有效: 
begin 
v:=VarArrayCreate([1,10000],varBate); 
p:=VarArrayLock(v) 
try 
move(A,P^,10000); 
finally 
VarArrayUnlock(v); 
end; 
end; 
6.VarArrayRef()获得variant指向的数据 
7.VarIsArray()函数是一个简单的布尔检查函数,如果传递给它的参数是一个Variant数组则返回True,否则返回False. 
8.VarClear()过程清除Variant变量并将VType域的值设为varEmpty. 
9.VarCopy()将Source复制到Dest。 
10.VarCast()将一个Variant转换成指定的类型并存储在另一个Variant变量中。 
11.VarType()返回指定Variant的varXXX类型代码。 
12.VarAsType()跟VarCast()的功能一样。 
13.VarIsEmpty()如果一个Variant变量的类型代码是varEmpty则返回True。 
14.VarIsNull()判断Variant变量是否包含null值。 
15.VarToStr()将一个Variant变量转换成字符串表达式(如果Variant为varEmpty或varNUll则为空字符 
串)。 
16.VarFromDateTime()返回一个Variant变量,它存放着指定的TDateTime类型的值。 
17.VarToDateTime()返回在Variant中的TDateTime类型的值。

Delphi中的变体Variant数组相关函数的更多相关文章

  1. Delphi 中的结构体与结构体指针

    好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...

  2. Delphi记录record中的变体

    program Day4; {$APPTYPE CONSOLE} uses SysUtils, Util in 'Util.pas'; type TPerson = packed record ID ...

  3. delphi中String 和 动态静态数组

    默认string类型为ansiString:有编译开关控制 shortString: strShort : shortString; strShort 大小256字节,可根据sizeof()计算出,s ...

  4. Hive中创建结构体、数组以及map

    ROW FORMAT DELIMITED 分隔符设置开始语句 FIELDS TERMINATED BY:设置字段与字段之间的分隔符 COLLECTION ITEMS TERMINATED BY:设置一 ...

  5. Delphi 变体数组 Dataset Locate 查找定位

    Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...

  6. Delphi中堆栈区别

     http://blog.csdn.net/zang141588761/article/details/52838728 Delphi中堆栈区别 2016-10-17 14:49 277人阅读 评论( ...

  7. 87. 再谈变体型Variant

    在85. BASIC和LotusScript中的Variant一文中.我提到了BASIC风格的语言中的变体型Variant.由于下述种种原因.在LotusScript中常常要用到变体型. 1.     ...

  8. Provide Several View Variants for End-Users 为最终用户提供多个视图变体

    In this lesson, you will learn how to provide several customized variants of the same View, and allo ...

  9. .NET C#杂谈(1):变体 - 协变、逆变与不变

    0. 文章目的:   介绍变体的概念,并介绍其对C#的意义 1. 阅读基础   了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体   变体这一概念用于描述存在继承关系的 ...

  10. 【Visual Lisp】变体与安全数组

    (vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...

随机推荐

  1. Linux之新增硬盘,分区,挂载

    1.新增硬盘后, 查看当前磁盘信息 fdisk -l 可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令: fdisk /dev/sdb  给第二块硬盘进行分区 ...

  2. vagrant搭建开发环境

    一:我们为什么需要用这玩意 我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux. 在我本地是可以的啊,我测了都,没有问题啊,然 ...

  3. ZJSU五月多校合训

    强度焦虑制造者 具体而言,zszz3在每个游戏版本中都会推出一名新角色,或加强一名旧角色.玩家必须将这名新角色或 被加强的旧角色编入队伍,否则就会落后于版本. 而编队数量是有限的,这意味着玩家可能不得 ...

  4. docker 打包镜像过程

    1.首先准备需要打成镜像的JAR包 2.编制Dockerfile文件 FROM docker.gf.com.cn/java:openjdk-8u292-arm64 MAINTAINER 8627905 ...

  5. Python实验:Socket编程

    实验六 Socket 编程 一.实验目标: 了解TCP协议原理.标准库socket 的用法.熟悉Socket 编程. 1.TCP协议原理: TCP(Transmission Control Proto ...

  6. ChatGPT生成测试用例的最佳实践(一)

    前面介绍的案例主要展示了ChatGPT在功能.安全和性能测试用例生成方面的应用和成果.通过ChatGPT生成测试用例,测试团队不仅可以提升工作效率,还可以加快测试工作的速度,尽早发现被测系统中的问题. ...

  7. 藏不住了,这届数字打工人(RPA)想在各行各业“当骨干”!

    数字化时代,最红的"打工人"是谁? 无疑,是RPA(数字化劳动力). 这种由机器人流程自动化+AI驱动,模拟人点击.移动鼠标等在电脑上的操作,在各种规则明确.高重复度业务场景中代替 ...

  8. jdk安装-windows和linux

    下载:见此博客https://www.cnblogs.com/zn19961006/p/12857930.html 一.windows安装 1.很简单,运行exe,然后一直下一步 选安装路径. 注意: ...

  9. Spring Cloud Sleuth in a Monolith Application

    1. Overview   In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...

  10. 操作系统messages文件位置更改

    问题现象 在遇到一个问题的时候需要查看操作系统的日志,但是到操作系统上的 /var/log/messages 文件中发现该文件已经很久没有刷新过了. 这个系统之前是做过安全加固的,我怀疑它改过操作系统 ...