Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
2011-10-11 20:59
483 查看
一、变体类型常用的函数介绍:
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类型的值。
二、一个简单实例代码:
vara, 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;
相关文章推荐
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数) .
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
- 常用转换类型函数介绍
- C++ UNICODE ANSI 类型转换 常用函数
- 变体类型转换成字符串(优先使用 _variant_t,尽量不用 VARIANT )
- Oracle常用函数(字符串、数据类型转换、日期类型)
- Objective-C中基本数据烦类型与对象数据类型相互转换的方法(OC中NSString的常用API的基础应用3)
- 关于常用 MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结
- CString、_bstr_t、_variant_t等类型的相互转换
- 常用的不同时间类型的相互转换
- C#调用VC DLL接口函数参数类型转换方法介绍
- Android数据类型之间相互转换系统介绍
- 二十二、标准库类型vector的使用、vector介绍、vector构造和初始化、vector常用成员函数
- [转]字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- C#调用VC DLL接口函数参数类型转换方法介绍
- C#调用VC DLL接口函数参数类型转换方法介绍
- ORACLE常用日期型函数(函数及类型转换)