4

如何将 TMemoryStream 的内容转换为变体?我使用德尔福 2010。

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

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

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

这就是为什么我需要将 TMemoryStream 转换为变体。

4

2 回答 2

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;
于 2013-01-16T17:39:25.777 回答
4

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

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

param.AsBlob := MyTBytesVariable;

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

param.AsStream := MyMemoryStream;

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

于 2013-01-16T17:39:37.047 回答