熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:開發Delphi對象式數據管理功能(五)[4]

2013-11-23 17:47:43  來源: Delphi編程 

   BLOB字段與文本

  Delphi BLOB字段中增加了大型文本的處理能力可以在TBlobField和Strings中自由地交換數據

  procedure TBlobFieldLoadFromStrings(Strings: TStrings)

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStreamCreate(Self bmWrite)

  try

  StringsSaveToStream(BlobStream)

  finally

  BlobStreamFree;

  end;

  end;

  procedure TBlobFieldSaveToStrings(Strings: TStrings)

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStreamCreate(Self bmRead)

  try

  StringsLoadFromStream(BlobStream)

  finally

  BlobStreamFree;

  end;

  end;

   BLOB字段與Stream對象

  因為Delphi中BLOB字段是通過BLOB流來訪問的所以可以很容易地在BLOB字段和Stream對象之間傳遞數據為此TBlobField對象提供了LoadFromStream和SaveToStream方法

  procedure TBlobFieldLoadFromStream(Stream: TStream)

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStreamCreate(Self bmWrite)

  try

  BlobStreamCopyFrom(Stream

  finally

  BlobStreamFree;

  end;

  end;

  procedure TBlobFieldSaveToStream(Stream: TStream)

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStreamCreate(Self bmRead)

  try

  StreamCopyFrom(BlobStream

  finally

  BlobStreamFree;

  end;

  end;

   存取嵌入在OleContainer對象中的OLE服務器的數據

  對象鏈接和嵌入(Object Linking and Embedding簡稱OLE)是一組服務功能它提供了一種用來源於不同應用程序的信息創建復合文檔的強有力方法

  通過把圖像圖形表格聲音注解文件和其它表示手段描述成對象用它能在不同軟件廠家提供的應用程序中更為容易地交換合成和處理數據它是應用程序的集成更為容易OLE支持直觀編輯用戶不需切換到不同窗口就能在文檔中直接對對象進行操作改進了操作環境用戶不用再關注應用程序和操作環境只需關注於使用對象技術的數據和文件便能完成全部工作

  OLE已成為操作系統功能上的一大標准各大軟商紛紛在開發工具中支持OLE 規范Delphi 提供了OleContainer對象支持OLE窗戶應用程序的開發

  盡管通過OLE可以用來源於不同應用程序的信息創建復合文檔充分體現以任務以文檔為中心的思想但是很難分解來自其它應用程序中的嵌入數據以進行特殊的處理

  例如一套多媒體電子文檔管理系統系統需要數據庫管理功能文檔編輯功能全文檢索功能等在文檔編輯功能的實現上如果能利用中文Word 或寫字板之類的強大的編輯排版功能就可以省卻重新開發一個文檔編輯的費用使用具有直觀編輯的OLE復合文檔嵌入Word的DOC數據或RTF數據當然是最佳的選擇 但問題在於全文檢索系統要求能直接在文檔中搜索關鍵字因此要求將文檔數據從OLE嵌入數據或文檔中的本地數據中分離出來

  Delphi 的OleContainer部件支持存儲OLE對象數據OLE對象數據包括兩部分OLE類描述信息和OLE服務器嵌入數據一般說來OLE服務器嵌入數據是以服務器支持的數據格式存儲的 比方說中文Word 的嵌入數據的格式就是Word 文檔的格式因此要將文檔數據從OLE 嵌入式文檔中分離出來就是要訪問第二部分數據

  我們分析了Delphi 的OleContainer對象存取復合文檔的程序得到分離數據的方法

  讓我們來看一段OleContainer對象存儲數據的程序

  procedure TOleContainerSaveToStream(Stream: TStream)

  var

  DataHandle: HGlobal;

  Buffer: Pointer;

  Header: TStreamHeader;

  R: TRect;

  ……

  begin

  ……

  try

  ……

  if FOldStreamFormat then

  begin

  R := BoundsRect;

  HeaderPartRectLeft := RLeft;

  HeaderPartRectTop := RTop;

  HeaderPartRectRight := RRight;

  HeaderPartRectBottom := RBottom;

  end else

  begin

  HeaderSignature := StreamSignature;

  HeaderDrawAspect := FDrawAspect;

  end;

  HeaderDataSize := GlobalSize(DataHandle)

  StreamWriteBuffer(Header SizeOf(Header))

  Buffer := GlobalLock(DataHandle)

  try

  StreamWriteBuffer(Buffer^ HeaderDataSize)

  finally

  GlobalUnlock(DataHandle)

  end;

  finally

  ReleaseObject(TempStorage)

  ReleaseObject(TempLockBytes)

  end;

  end;

  程序中OleContainer對象執行了兩次往流中寫數據的操作

  StreamWriteBuffer(Header Size(Header))

  StreamWriteBuffer(Buffer^ HeaderDataSize)

  前一語句是寫入OLE類描述信息後一句語句是寫入OLE服務器的嵌入數據Header是TStreamHeader記錄類型的變量TStreamHeader記錄的定義如下

  TStreamHeader = record

  case Integer of

  : ( { 新版OLE對象 }

  Signature: Integer;

  DrawAspect: Integer;

  DataSize: Integer)

  : ( { 舊版OLE對象 }

  PartRect: TSmallRect)

  end;

  因此讀OLE服務器嵌入數據時要跳過文件頭的TStreamHeader記錄下面就是如何分離OLE服務器嵌入數據的程序

  var

  Stream : TMemoryStream;

  FileStream : TFileStream;

  begin

  Stream := TMemoryStreamCreate;

  FileStream := TFileStreamCreate(TESTDOC fmCreate) ;

  with OleContainer do

  if (State <> osEmpty) then

  SaveToStream(Stream)

  StreamSeek(Sizeof(TStreamHeader)

  FileStreamCopyFrom(Stream StreamSize SizeOf(TStreamHeader))

  StreamFree;

  FileStreamFree;

  end;

  OleContainer包含的服務器對象是中文Word 程序中將分離出的數據存儲在磁盤文件TESTDOC如果希望存儲在不同的媒介上可以使用相應的Stream對象分離的方法類似但是這種方法並非對所有的OLE服務器數據都適用如Windows 附件中的寫字板(WordPad)就不行

  返回目錄DELPHI基礎教程

       編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南

  Java程序性能優化讓你的Java程序更快更穩定

  C嵌入式編程設計模式

  Android游戲開發實踐指南

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25091.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.