|
delphi Variant 与 流(TStream)相互转换
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 异常。
|
|