将TMemoryStream转换为variant

时间:2013-01-16 17:16:58

标签: delphi memorystream variant

如何将TMemoryStream的内容转换为变体?我使用的是Delphi 2010。

TMemoryStream存储文件的内容,可以是PDF或JPG(扫描文档)。

文件保存在MS SQL库中。 当我在程序中进入编辑模式时,我将该文件的内容从base提取到TMemoryStream中。

编辑文件卡后,我需要将文件发回基地。 扫描文件也可以更改(或替换为其他文件)。 要记录回来,我使用带有一堆参数的存储过程 - 每个字段一个。 我将参数作为变量传递给存储过程。

这就是我需要将TMemoryStream转换为变体的原因。

2 个答案:

答案 0 :(得分:10)

假设你需要Variant来保存一个字节数组,你可以使用它:

var
  MS: TMemoryStream;
  V: Variant;
  P: Pointer;
begin
  ...
  V := VarArrayCreate([0, MS.Size-1], varByte);
  if MS.Size > 0 then
  begin
    P := VarArrayLock(V);
    Move(MS.Memory^, P^, MS.Size);
    VarArrayUnlock(V);
  end;
  ...
end;

答案 1 :(得分:4)

TMemoryStream没有方便直接访问内部数据的方法。它提供了一个属性,为您提供指针,但不提供任何有用的数据类型。但是,如果您使用TBytesStream派生的TMemoryStream,则可以将流中的数据作为TBytes类型的变量。

在此之后,假设您的参数是TParam类型的标准参数对象,则不需要使用变量。你可以这样做:

param.AsBlob := MyTBytesVariable;

或者,甚至比这更简单,您可以直接使用流:

param.AsStream := MyMemoryStream;

(如果这样做,请确保首先将流的Position设置为0。)

相关问题