来源:http://blog.csdn.net/xiongmao000738/article/details/6863988

一、变体类型常用的函数介绍:

Variant: 一种可以拥有各种数据类型; 也可以告诉目前存储的数据是什么类型(通过使用VarType函数); 可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法; variant数组只不过是variant型的数组,不必包含同类型的数据;

1、  VarArrayOf函数:更快捷的创建一维变体数组,可以创建全异的数值数组; function VarArrayOf(const Values: array of Variant): Variant;

VarArrayOf是一种快速(写代码快而不是运行快)的方法生成一个一维Variant数据的方法,它接受一个Variant类型的Open Array,用这个数据生成一个一维的Variant Array of Variant(类型为Variant)。由于Delphi对Open Array类型参数的支持,使你可以用一行语句生成一个数组。不过它有两个缺陷:只能生成一维数组;只能生成元素类型是Variant的数组。使用Variant数组, 与使用标准Delphi数组类似; 例如: MyArray := VarArrayOf(['李维', 30, '60', 60.369, 'China']);

2、  VarArrayCreate函数: function VarArrayCreate(const Bounds: array of Integer; VarType: TVarType): Variant;

Bounds: 告诉数组的上下界; VarType: 决定了数组的中存储什么类型的数据。其它的数组(如二维、或者其他类型等)只能用VarArrayCreate去创建,并用循环给元素赋值。 例如:创建数组的数组, 可以模仿任何类型的数据结构类型:             VarArrayX := VarArrayCreate([1,10], varVariant); 数组的单个元素可以装载一个数组: VarArrayX[1] := VarArrayCreate([1,5], varVariant);

3、VarArrayHighBound、VarArrayLowBound函数:返回变体数组上/下限,从1开始(1:列;2:行;3:3维的最后一维)。 function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;

4、VarArrayRedim函数:修改variant数组的最高限。 procedure VarArrayRedim(A: Variant; HighBound: Integer);

5、VarArrayDimCount函数:返回variant数组维数 unction VarArrayDimCount(const A: Variant): Integer;

6、VarArrayLock、VarArrayUnLock函数:避免运行时刻检查。一般用于初始化一个大数组。 function VarArrayLock(const A: Variant): Pointer; procedure VarArrayUnlock(var A: Variant);

在对Variant数组的每一个元素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避免运行时检查,要用VarArrayLock()函数和VarArrayUnlock()过程。VarArrayLock()函数在内存中锁定数组,使数组不再移动和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程用来对VarArrayLock()函数锁定的数组进行解锁,使数组能重新移动或改变大小。在锁定数组后,能用更有效的方法对数组进行初始化。

7、VarArrayRef函数:获得variant指向的数据 function VarArrayRef(const A: Variant): Variant;

8、VarIsArray函数:是一个简单的布尔检查函数,判断是否是一个 Variant数组,是则返回True function VarIsArray(const A: Variant): Boolean; overload; function VarIsArray(const A: Variant; AResolveByRef: Boolean): Boolean; overload;

9、其他函数

1>、VarClear()过程清除Variant变量并将VType域的值设为varEmpty. 2>、VarCopy()将Source复制到Dest。 3>、VarCast()将一个Variant转换成指定的类型并存储在另一个Variant变量中。 4>、VarType()返回指定Variant的varXXX类型代码。 5>、VarAsType()跟VarCast()的功能一样。 6>、VarIsEmpty()如果一个Variant变量的类型代码是varEmpty则返回True。 7>、VarIsNull()判断Variant变量是否包含null值。 8>、VarToStr()将一个Variant变量转换成字符串表达式(如果Variant为varEmpty或varNUll则为空字符串)。 9>、VarFromDateTime()返回一个Variant变量,它存放着指定的TDateTime类型的值。 10>、VarToDateTime()返回在Variant中的TDateTime类型的值。

二、一个简单实例代码:

var

a, b: Variant;

I, J, K, M: Integer;

begin

//a是个一维Variant数组,元素类型是Variant,元素个数是3,上界是2,下界是0。

a := VarArrayOf([1234,   'abc ',   Null]);

//b是一个16行4列的二维数组

b := VarArrayCreate[0, 3, 1, 16],   varOleStr);

 I := VarArrayHighBound(b, 1); // I是b的最大列号:3;

J := VarArrayLowBound(b, 1); // J是b的最小列号:0;

K := VarArrayHighBound(b, 2); // K是b的最大行号:16;

M := VarArrayLowBound(b, 2); // M是b的最小行号:1。

end;

注意,Variant数组下标是列在前,行在后,元素类型是PWideChar,最大列号是3,最小列号是0,最大行号是16,最小行号是1。

三、变体类型和流的相互转换

//1、 变体类型转成流

procedure VariantToStream(const Data: OleVariant; Stream: TStream);

var

p: Pointer;

begin

p := VarArrayLock(Data);  // 加锁,并返回一个指针指向的数据。 避免运行时时刻检查

try

Stream.Write(p^, VarArrayHighBound(Data,1) + 1);  // 返回最大的列号

finally

VarArrayUnlock(Data); // 解锁,使数组能重新移动或改变大小。

end;

end;

// 2、流转成变体类型

function StreamToVariant(Stream: TStream): OleVariant;

var

p: Pointer;

begin

Result := VarArrayCreate([0, Stream.Size - 1], varByte);// 创建一个以为的数组。类型为varByte

p := VarArrayLock(Result);

try

Stream.Position := 0;  // 设置流的位置

Stream.Read(p^, Stream.Size);

finally

VarArrayUnlock(Result);

end;

end;

转载于:https://www.cnblogs.com/760044827qq/p/3819300.html

Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)...相关推荐

  1. 关于COM中变体类型VARIANT

    从com的设计初衷来讲,要达到跨语言的目的,但是c++啊,java,python,pascal什么的都是有自己的数据类型的,设计这个变体类型VARIANT就是为了达到这个目的,之所以称之为变体类型是因 ...

  2. 变体类型Variant

    变体类型Variant,能够在运行期间动态的改变类型.变体类型能支持所有简单的数据类型,如整型.浮点.字符串.布尔型.日期时间.货币及OLE自动化对象等,不能够表达Object Pascal对象. 1 ...

  3. C++变体数据类型—— VARIANT

    百度百科: Variant 音标 Phonetic symbol [] 词性及解释 Part of speech and defination n. 变体, 异体 a. 不同的, 有差别的 [计] 变 ...

  4. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  5. Java中的enum详细解析------Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  6. 常用文件类型 -- JSON文件介绍

    文章目录 JSON文件介绍 1.1 什么是JSON 1.2 JSON语法规则 1.3 JSON举例 1.4 JSON和XML比较 1.4.1 XML的优缺点 1.4.1.1 XML的优点 1.4.1. ...

  7. WebGL three.js学习笔记 6种类型的纹理介绍及应用

    WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...

  8. Unity 之 音频类型和编码格式介绍

    Unity 之 音频类型和编码格式介绍 一,加载音频文件 二,Load Type:加载类型 三,编码格式与品质级别 Inspector窗口显示多个导入设置.这些设置决定了:加载行为,压缩行为,质量,采 ...

  9. input:file上传类型控制简单介绍

    <input type="file">可以上传文件,这个就不用多介绍了. 其实我们使用此控件可以进行上传文件格式的控制. 特别说明:在实际应用中,不但要在前端进行验证, ...

最新文章

  1. Ubuntu台式机如何用usb无线网卡共享网络
  2. SQLHELPER C#
  3. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
  4. 佛山居住证办理(首次)
  5. linux 内核探测kprobe 初步了解
  6. servlet实现文件上传,预览,下载和删除
  7. Webkit for android
  8. PHP 将json的stdClass Object转成数组array
  9. 流行的9个Java框架介绍:优点、缺点等等
  10. [考试]20151008
  11. 《算法:C语言实现》阅读笔记
  12. php该怎么下载文件,php怎么实现下载文件?
  13. bypass功能介绍
  14. 分布式服务架构:原理、设计与实践
  15. 对腾讯云qcloud音视频通信SDK的调研(优缺点)
  16. 成功解决 TKK: 更新 TKK 失败,请检查网络连接 idea翻译错误
  17. 产业分析:光伏产业发展路线图
  18. 会声会影x4素材_会声会影素材包
  19. Plants vs. Zombies【二分】
  20. win 10系统搜索计算机,win10系统查找计算器的解决教程

热门文章

  1. python内存管理机制_python内存管理机制
  2. keil4怎么移植其他人的程序_简单和你聊聊造血干细胞移植!
  3. 《springcloud超级入门》Spring Cloud是什么?Spring Cloud版本介绍《二》
  4. iphone11边框喇手问题_别贪图小便宜!iPhone11真机上手,3个缺点不得不说
  5. 计算机屏幕亮度调到多少合适,电脑屏幕的亮度和对比度调到多少比较合适,对眼睛伤害最小?有哪位高手了解?...
  6. mysql datetime 后面带了很多0_面试官:MySQL 表设计要注意什么?
  7. python中的运算符_Python中的运算符
  8. 【蓝桥杯每日一练】 斐波那契数列
  9. 跟着川川学数模-Day2
  10. 专科学数控还是计算机,盘点适合专科男生学的专业 哪些专业好就业