Variant 与 流(TStream)相互转换
代码
Variant转TStream
procedure VariantToStream(Stream: TStream; const Value: Variant);
varp: Pointer;
beginif VarIsNull(Value) or VarIsEmpty(Value) thenExit;Stream.Size := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;p := VarArrayLock(Value);tryStream.position := 0;Stream.Write(p^, Stream.Size);Stream.position := 0;finallyVarArrayUnlock(Value);end;
end;
TStream转Variant
function StreamToVariant(Stream: TStream): Variant;
varp: Pointer;
beginif Stream.Size = 0 thenExit(Null);Result := VarArrayCreate([0, Stream.Size - 1], varByte);p := VarArrayLock(Result);tryStream.position := 0;Stream.Read(p^, Stream.Size)finallyVarArrayUnlock(Result);end;
end;
方法
System.Variants.VarArrayLock
function VarArrayLock(const A: Variant): Pointer;
锁定变体数组并返回指向数据的指针。
锁定时,无法调整变体数组的大小,任何对VarArrayRedim
的调用都会失败。锁定后,变体数组必须在以后使用VarArrayUnlock
来解锁。如果 A
给出的变体不是数组,则会引发 EVariantInvalidArgError
异常。
一旦验证变体数组具有正确的边界和维度,就可以使用 VarArrayLock
来直接访问数组数据,从而提高性能。
System.Variants.VarArrayUnlock
procedure VarArrayUnlock(const A: Variant);
解锁之前被 VarArrayLock
锁定的变体数组。如果 A 给出的变体不是数组,则会引发 EVariantInvalidArgError
异常。