打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Variant和Tstream这间相互转化

Variant和Tstream这间相互转化

所在单元

Variants

function VarArrayLock(const A: Variant): Pointer;

      VarArrayLock锁定给定的变量数组,并返回一个指针数组中存储的数据。锁定时,一个Variant数组不能被调整和任何VarArrayRedim的调用将失败。一旦锁定,一个Variant数组必须使用VarArrayUnlock后来被解锁。如果由一个给定的变种,是不是一个数组,一个EVariantError将引发异常。

返回的指针数组元素,其中最左边的尺寸先增加VarArrayLock点。换句话说,返回的数组指针的尺寸逆转从变异阵列的尺寸。

VarArrayLock一旦被证实,一个Variant数组有正确的边界和尺寸,可用于直接访问阵列中的数据,从而提高性能。


function VarArrayCreate(const Bounds: array of Integer; AVarType: TVarType): Variant;

    VarArrayCreate创建一个变量数组给予的范围元素类型VARTYPEbounds参数必须包含一个值偶数,其中对值指定一个数组的维数上限和下限
    注:Bounds_size参数边界数组最后一个值索引这是一个比总数因此Bounds_size必须始终是一个奇数。
VARTYPE参数数组元素类型一个变种类型代码这必须是System单元中定义的常量之一它不能包括varArrayvarByRef元素类型不能varString自定义Variant类型要创建一个字符串变量数组使用varOleStr类型代码如果该元素类型varVariant数组中的元素本身的变种可以在包含变种阵列
   如果VarArrayCreate无法创建阵列一个EVariantArrayCreateError提出
  
// 内存流转成 Variant
Function MemoryStreamToVariant(Const Strm: TStream): Variant;
Var
Data: PByteArray;
Begin
Result := VarArrayCreate([0, Strm.Size - 1], varByte);
Data := VarArrayLock(Result);
Try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
Finally
VarArrayUnlock(Result);
End;
End;
// variant转为内存
Procedure VariantToMemoryStream(Const OV: Variant; Var OutStream: TStream);
Var
Data: PByteArray;
Size: Integer;
Begin
OutStream := Nil;
If Not Assigned(OutStream) Then
OutStream := TMemoryStream.Create;
OutStream.Position := 0;
TMemoryStream(OutStream).Clear;
Size := VarArrayHighBound(OV, 1) - VarArrayLowBound(OV, 1) + 1;
Data := VarArrayLock(OV);
Try
OutStream.WriteBuffer(Data^, Size);
Finally
VarArrayUnlock(OV);
End;
End;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数...
Copy an object into a VARIANT???
Variant 的相关函数
Delphi中Variant和Stream的互换
Variant的相关函数
【C++】STL常用容器总结之十二:string类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服