首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 物件式資料管理:BLOB 欄位串流操作與 OLE 容器資料提取

     編輯:Delphi

20.3.2.4 BLOB 欄位與 Stream 物件互轉

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;

20.3.3 存取嵌入 OleContainer 的 OLE 伺服器資料

OLE 2.0 支援直觀編輯,Delphi 2.0 提供 OleContainer 元件。但從複合文件中分離嵌入資料進行特殊處理(如全文檢索)較困難。

資料結構分析

OleContainer.SaveToStream 執行兩次寫入:

  1. Stream.WriteBuffer(Header, SizeOf(Header)) — OLE 類別描述資訊 (TStreamHeader)
  2. 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 即不行)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved