在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型; 也可以告诉目前存储的数据是什么类型(通过使用VarType函数); 可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法; variant数组只不过是variant型的数组,不必包含同类型的数据; 1、 VarArrayOf函数:更快捷的创建一维变体数组,可以创建全异的数值数组;
VarArrayOf是一种快速(写代码快而不是运行快)的方法生成一个一维Variant数据的方法,它接受一个Variant类型的Open
Array,用这个数据生成一个一维的Variant Array of
Variant(类型为Variant)。由于Delphi对Open Array类型参数的支持,使你可以用一行语句生成一个数组。不过它有两个缺陷:
只能生成一维数组;只能生成元素类型是Variant的数组。使用Variant数组, 与使用标准Delphi数组类似; 2、 VarArrayCreate函数: Bounds: 告诉数组的上下界; VarType: 决定了数组的中存储什么类型的数据。其它的数组(如二维、或者其他类型等)只能用VarArrayCreate去创建,并用循环给元素赋值。 3、VarArrayHighBound、VarArrayLowBound函数:返回变体数组上/下限,从1开始(1:列;2:行;3:3维的最后一维)。 4、VarArrayRedim函数:修改variant数组的最高限。 5、VarArrayDimCount函数:返回variant数组维数 6、VarArrayLock、VarArrayUnLock函数:避免运行时刻检查。一般用于初始化一个大数组。 在对Variant数组的每一个元素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避免运行时检 查,要用VarArrayLock()函数和VarArrayUnlock()过程。VarArrayLock()函数在内存中锁定数组,使数组不再移动 和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程用来对VarArrayLock()函数锁定的数组进行解锁,使数 组能重新移动或改变大小。在锁定数组后,能用更有效的方法对数组进行初始化。 7、VarArrayRef函数:获得variant指向的数据 8、VarIsArray函数:是一个简单的布尔检查函数,判断是否是一个 Variant数组,是则返回True 9、其他函数 1>、VarClear()过程清除Variant变量并将VType域的值设为varEmpty. 二、一个简单实例代码: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; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论