Variant是一个极其包容的数据类型,但并没有包括对象类型,如Stream类型。
当我们用Variant声明数据类型时候,遇到Stream,可将Stream转换为一维的Variant数组。反之亦然。
//将变体转换为流
Procedure VariantToStream(const v: Variant; Stream: TMemoryStream);
var
p: pointer;
begin
Stream.Position := 0;
Stream.Size := VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1;
p := VarArrayLock(v);
try
Stream.Write(p^, Stream.Size);
finally
VarArrayUnlock(v);
Stream.Position := 0;
end;
end;
procedure StreamToVariant(Stream: TMemoryStream; var v: Variant);
var
p: pointer;
begin
v := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(v);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(v);
end;
end;
需要注意的是,在RO中,Variant不支持多维的变体数组,只支持一维的数组。