4

TMemoryStream のコンテンツをバリアントに変換するにはどうすればよいですか? Delphi 2010 を使用しています。

TMemoryStream は、PDF または JPG (スキャンしたドキュメント) のファイルのコンテンツを保存します。

ファイルは MS SQL ベース内に保持されています。プログラムで編集モードに入ると、そのファイルの内容を base から TMemoryStream に抽出します。

ドキュメントのカードを編集した後、ドキュメントをベースに戻す必要があります。スキャンされたファイルも変更される (または他のファイルに置き換えられる) 可能性があります。レコードをポストバックするには、一連のパラメーター (フィールドごとに 1 つ) を持つストアド プロシージャを使用します。パラメータをバリアントとしてストアド プロシージャに渡します。

そのため、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

この後、パラメーターが type の標準パラメーター オブジェクトであると仮定するとTParam、バリアントを使用する必要はありません。次のように実行できます。

param.AsBlob := MyTBytesVariable;

または、それよりもさらに簡単に、ストリームを直接使用できます。

param.AsStream := MyMemoryStream;

(これを行う場合は、Position最初にストリームが 0 に設定されていることを確認してください。)

于 2013-01-16T17:39:37.047 に答える