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;

posted on 2012-03-07 15:22  long6  阅读(671)  评论(0编辑  收藏  举报

导航