Delphi 以 BLOB 串流存取 BLOB 欄位,TBlobField 提供 LoadFromStream/SaveToStream 方法實現資料雙向傳輸:
procedure TBlobField.LoadFromStream(Stream: TStream);
var BlobStream: TBlobStream;
begin
BlobStream := TBlobStream.Create(Self, bmWrite);
try BlobStream.CopyFrom(Stream, 0); finally BlobStream.Free; end;
end;
procedure TBlobField.SaveToStream(Stream: TStream);
var BlobStream: TBlobStream;
begin
BlobStream := TBlobStream.Create(Self, bmRead);
try Stream.CopyFrom(BlobStream, 0); finally BlobStream.Free; end;
end;
OLE 2.0 支援直觀編輯,Delphi 2.0 提供 OleContainer 元件。但從複合文件中分離嵌入資料進行特殊處理(如全文檢索)較困難。
OleContainer.SaveToStream 執行兩次寫入:
Stream.WriteBuffer(Header, SizeOf(Header)) — OLE 類別描述資訊 (TStreamHeader)Stream.WriteBuffer(Buffer^, Header.DataSize) — OLE 伺服器嵌入資料TStreamHeader 為變體記錄,新版包含 Signature、DrawAspect、DataSize;舊版含 PartRect。
讀取時跳過 TStreamHeader 即可獲得純伺服器資料:
var Stream: TMemoryStream; FileStream: TFileStream;
begin
Stream := TMemoryStream.Create;
FileStream := TFileStream.Create('TEST.DOC', fmCreate);
with OleContainer1 do
if State <> osEmpty then SaveToStream(Stream);
Stream.Seek(SizeOf(TStreamHeader), 0);
FileStream.CopyFrom(Stream, Stream.Size - SizeOf(TStreamHeader));
Stream.Free; FileStream.Free;
end;
範例中伺服器為中文 Word 6.0,輸出 TEST.DOC。換用其他串流類別可存異媒介。注意:不適用所有伺服器(如 WordPad 即不行)。