Variant 与 流(TStream)相互转换
代码
Variant转TStream
procedure VariantToStream(Stream: TStream; const Value: Variant);
var
p: Pointer;
begin
if VarIsNull(Value) or VarIsEmpty(Value) then
Exit;
Stream.Size := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;
p := VarArrayLock(Value);
try
Stream.position := 0;
Stream.Write(p^, Stream.Size);
Stream.position := 0;
finally
VarArrayUnlock(Value);
end;
end;
TStream转Variant
function StreamToVariant(Stream: TStream): Variant;
var
p: Pointer;
begin
if Stream.Size = 0 then
Exit(Null);
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.position := 0;
Stream.Read(p^, Stream.Size)
finally
VarArrayUnlock(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
异常。