[转]Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)

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

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

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;

时间: 2024-10-12 17:43:29

[转]Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)的相关文章

DELPHI中枚举类型数据的介绍和使用方法

在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类型数据的介绍和使用方法.见笑..------------------------------------------------------枚举类型 Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据.例如,性别.月份.星期几.颜色.单位名.学历.职业等.1.枚举类型的定义格式: ty

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

来源:http://blog.csdn.net/xiongmao000738/article/details/6863988 一.变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型: 也可以告诉目前存储的数据是什么类型(通过使用VarType函数): 可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法: variant数组只不过是variant型的数组,不必包含同类型的数据: 1.  VarArrayOf函数:更快捷的创建一维变体数组,可以

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

Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似.不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围. 举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现. 清单 1. 常量定义 Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜

.net ——流的类型体系简单介绍

流的类型体系 基础流 装饰器流 包装器类 帮助类 继承自基本的stream流 在基础Stream上添加的功能 数据传输 对文件流的操作变简单 基础流 Stream 对应的后备存储是文件 内存 网络资源 FileStream MemoryStream NetWorkStream IsolatedStorgaeFileStream: 继承自FileStream 感觉还是挺类Java的. 装饰器流 BufferdStream DeflateStream GZipStream CryptoStream

C++map类型 之 简单介绍

一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). 关联容器(Associative containers)支持通过键来高效地查找和读取元素. 两个主要的关联容器类型是 map 和 set. 当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包括一个键.并有效地支持

linux系统下软件安装包类型及安装介绍

linux系统下软件安装包类型及安装介绍 一.解析Linux应用软件安装包,通常Linux应用软件的安装包有四种: 1)tar包,如software-1.2.3-1.tar.gz.他是使用UNIX系统的打包工具tar打包的. 2)rpm包,如software-1.2.3-1.i386.rpm.他是Redhat Linux提供的一种包封装格式.包的管理工具YUM 3)dpkg包,如software-1.2.3-1.deb.他是Debain Linux提供的一种包封装格式.包的管理工具apt-get

【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html#1.2.values方法的使用: Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由arthinking发表于4年前 | Java基础 | 暂无评论 |  被围观 8,332 views+ 1.枚举(Enum):1.1.枚举类型中的两个静态方法:1.2.values方法的使用:

Delphi SetWindowlong 的使用方法及介绍

SetWindowLong函数介绍. SetWindowLong Unicode 函数原型 LONG SetWindowLong(hwnd,nIndex,lNewLong) HWND hwnd; /* handle of window */ int nIndex; /* offset of value to set */ LONG lNewLong; /* new value */ 函数说明 SetWindowLong函数修改给定窗口的一个属性.该函数还在给定窗口的附加窗口内存中 的指定偏移量处

XML(二)有效的XML: DTD(文档类型定义)介绍与三种使用方式

有效的XML: DTD(文档类型定义)介绍 有效(Valid)的XML文档: 首先,XML文档是个格式正规的(Well-formed)XML文档: 其次,需要满足DTD的要求,这样的XML文档称为有效的(Valid)XML文档. DTD DTD,即文档类型定义——Document Type Definition. DTD用来描述XML文档的结构, 一个DTD文档包含: 元素(ELEMENT)的定义规则: 元素之间的关系规则: 属性(ATTLIST)的定义规则: 可使用的实体(ENTITY)或符号