?? 052.htm
字號:
face="宋體" lang="ZH-CN">對象的意義就在于:一方面可以使</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">應用程序充分利用多媒體數據庫的數據管理能力;另一方面又能利用</font><font
face="Arial">Object Pascal</font><font face="宋體" lang="ZH-CN">的強大程序設計能力給多媒體數據庫提供全方向的功能擴展余地。</p>
<p> 使用</font><font face="Arial">TBlobStream</font><font face="宋體"
lang="ZH-CN">對象可以在多媒體數據庫的</font><font face="Arial">BLOB</font><font
face="宋體" lang="ZH-CN">字段存儲任意格式的數據。一般說來,許多多媒體數據庫只能支持圖像、語音或者</font><font
face="Arial">OLE</font><font face="宋體" lang="ZH-CN">服務器支持的數據。利用</font><font
face="Arial">TBlobStream</font><font face="宋體" lang="ZH-CN">則不同,只要是程序能夠定義的數據格式,它都能在</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">字段中讀寫,而不需要其它輔助工具。</p>
<p> </font><font face="Arial">TBlobStream</font><font face="宋體" lang="ZH-CN">用構造方法</font><font
face="Arial">Create</font><font face="宋體" lang="ZH-CN">建立數據庫域和</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">流的聯接。用</font><font
face="Arial">Read</font><font face="宋體" lang="ZH-CN">或</font><font face="Arial">Write
</font><font face="宋體" lang="ZH-CN">方法訪問和改變域中的內容;用</font><font
face="Arial">Seek</font><font face="宋體" lang="ZH-CN">方法,在域中定位;用</font><font
face="Arial">Truncate</font><font face="宋體" lang="ZH-CN">方法刪除域中當前位置起所有的數據。</p>
<p> </font><font face="Arial"></p>
<p>20.1.7.1 TBlobStream</font><font face="宋體" lang="ZH-CN">的屬性和方法</p>
<p> </p>
<p> </font><font face="Arial">TBlobStream</font><font face="宋體" lang="ZH-CN">對象從</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">直接繼承,沒有增添新的屬性。它覆蓋了</font><font
face="Arial">Read</font><font face="宋體" lang="ZH-CN">、</font><font face="Arial">Write
</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Seek</font><font
face="宋體" lang="ZH-CN">方法,提供了對</font><font face="Arial">BLOB</font><font
face="宋體" lang="ZH-CN">字段的訪問操作;它增添了</font><font face="Arial">Truncate</font><font
face="宋體" lang="ZH-CN">方法以實現</font><font face="Arial">BLOB</font><font
face="宋體" lang="ZH-CN">字段中的刪除操作。</p>
<p> </font><font face="Arial">1. Read</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Read(var Buffer; Count: Longint):
Longint; </p>
<p>Read</font><font face="宋體" lang="ZH-CN">方法從數據庫域的當前位置起復制</font><font
face="Arial">Count</font><font face="宋體" lang="ZH-CN">個字節的內容到</font><font
face="Arial">Buffer</font><font face="宋體" lang="ZH-CN">中。</font><font face="Arial">Buffer</font><font
face="宋體" lang="ZH-CN">也必須至少分配</font><font face="Arial">Count</font><font
face="宋體" lang="ZH-CN">個字節。</font><font face="Arial">Read</font><font
face="宋體" lang="ZH-CN">方法返回實際傳輸的字節數,因為傳輸的字節數可能小于</font><font
face="Arial">Count</font><font face="宋體" lang="ZH-CN">,所以需要選擇符的邊界判斷。</p>
<p> </font><font face="Arial">2. Write</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Write(const Buffer; Count: Longint);
override; Longint; </p>
<p>Write</font><font face="宋體" lang="ZH-CN">方法從</font><font face="Arial">Buffer</font><font
face="宋體" lang="ZH-CN">中向數據庫域的當前位置復制</font><font
face="Arial">Count</font><font face="宋體" lang="ZH-CN">個字節的內容。</font><font
face="Arial">Buffer</font><font face="宋體" lang="ZH-CN">必須分配有</font><font
face="Arial">Count</font><font face="宋體" lang="ZH-CN">個字節的內存空間,函數返回實際傳輸的字節數,傳輸過程也要進行選擇符邊界判斷。</p>
<p> </font><font face="Arial">3. Seek</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Seek(Offset: Longint; Origin: Word):
Longint; </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Seek</font><font face="宋體" lang="ZH-CN">方法重新設置</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">流中的指針位置。如果</font><font
face="Arial">Origin</font><font face="宋體" lang="ZH-CN">的值是</font><font
face="Arial">soFromBeginning</font><font face="宋體" lang="ZH-CN">,則新的指針位置是</font><font
face="Arial">Offset; </font><font face="宋體" lang="ZH-CN">如</font><font face="Arial">Origin</font><font
face="宋體" lang="ZH-CN">的值是</font><font face="Arial">soFromCurrent</font><font
face="宋體" lang="ZH-CN">,則新的指針位置是</font><font face="Arial">Position+Offset</font><font
face="宋體" lang="ZH-CN">;如果</font><font face="Arial">Origin</font><font
face="宋體" lang="ZH-CN">的值是</font><font face="Arial">SoFromCurrent</font><font
face="宋體" lang="ZH-CN">,則新的指針位置是</font><font face="Arial">Size+Offset</font><font
face="宋體" lang="ZH-CN">。函數返回新的指針位置值。當</font><font
face="Arial">Origin</font><font face="宋體" lang="ZH-CN">為</font><font face="Arial">0(SoFromBegin)</font><font
face="宋體" lang="ZH-CN">時,</font><font face="Arial">Offset</font><font
face="宋體" lang="ZH-CN">的值必須大于等于零</font><font face="Arial">; </font><font
face="宋體" lang="ZH-CN">當</font><font face="Arial">Origin</font><font face="宋體"
lang="ZH-CN">的值為</font><font face="Arial">2(SoFromEnd)</font><font face="宋體"
lang="ZH-CN">,</font><font face="Arial">Offset</font><font face="宋體" lang="ZH-CN">的值必須小于等于零。</p>
<p> </font><font face="Arial">4. Truncate</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure Truncate; </p>
<p>Truncate</font><font face="宋體" lang="ZH-CN">方法撤消</font><font face="Arial">TBlobField</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">TBytesField</font><font
face="宋體" lang="ZH-CN">或</font><font face="Arial">TVarBytesField</font><font
face="宋體" lang="ZH-CN">中從當前位置起的數據。</p>
<p> </font><font face="Arial">5. Create</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">constructor Create(Field: TBlobField; Mode:
TBlobStreamMode); </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Create</font><font face="宋體" lang="ZH-CN">方法使用</font><font
face="Arial">Field</font><font face="宋體" lang="ZH-CN">參數建立</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">流與</font><font face="Arial">BLOB</font><font
face="宋體" lang="ZH-CN">字段的聯接。</font><font face="Arial">Mode </font><font
face="宋體" lang="ZH-CN">的值可為</font><font face="Arial">bmRead</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">bmWrite</font><font face="宋體"
lang="ZH-CN">和</font><font face="Arial">bmReadWrite</font><font face="宋體"
lang="ZH-CN">。</p>
<p> </font><font face="Arial"></p>
<p>20.1.7.2 TBlobStream</font><font face="宋體" lang="ZH-CN">的實現原理</p>
<p> </p>
<p> 說明</font><font face="Arial">TBlobStream</font><font face="宋體"
lang="ZH-CN">對象的實現原理,不可避免地要涉及它的私有域,下面是私有域的定義:</p>
<p> </p>
<p></font><font face="Arial">TBlobStream = class(TStream)</p>
<p>private</p>
<p>FField: TBlobField;</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">FDataSet: TDataSet;</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">FRecord: PChar;</p>
<p>FBuffer: PChar;</p>
<p>FFieldNo: Integer;</p>
<p>FOpened: Boolean;</p>
<p>FModified: Boolean;</p>
<p>FPosition: Longint;</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">public</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">end;</p>
<p> </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">FField</font><font face="宋體" lang="ZH-CN">是與</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">流相聯的數據庫</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">域,該域用于</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">流的內部訪問。</font><font
face="Arial">FDataSet</font><font face="宋體" lang="ZH-CN">是代表</font><font
face="Arial">FField</font><font face="宋體" lang="ZH-CN">所在的數據庫,它可以是</font><font
face="Arial">TTable</font><font face="宋體" lang="ZH-CN">部件,也可以是</font><font
face="Arial">TQuery </font><font face="宋體" lang="ZH-CN">部件。</font><font
face="Arial">FRecord</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">FBuffer</font><font
face="宋體" lang="ZH-CN">都是</font><font face="Arial">BLOB</font><font face="宋體"
lang="ZH-CN">流內部使用的緩沖區,用于存儲</font><font face="Arial">FField</font><font
face="宋體" lang="ZH-CN">所在記錄的數據,該數據記錄中不包含</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">數據,</font><font
face="Arial">TBlobStream</font><font face="宋體" lang="ZH-CN">使用</font><font
face="Arial">FRecord</font><font face="宋體" lang="ZH-CN">作為調用</font><font
face="Arial">BDE API</font><font face="宋體" lang="ZH-CN">函數的參數值。</font><font
face="Arial">FFieldNo</font><font face="宋體" lang="ZH-CN">代表</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">字段的字段號,也用于</font><font
face="Arial">BDE API</font><font face="宋體" lang="ZH-CN">的參數傳遞,</font><font
face="Arial">FOpened</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">FMocified</font><font
face="宋體" lang="ZH-CN">都是狀態信息,</font><font face="Arial">FPosition</font><font
face="宋體" lang="ZH-CN">表示</font><font face="Arial">BLOB</font><font face="宋體"
lang="ZH-CN">流的當前位置,下面介紹</font><font face="Arial">TBlobStream</font><font
face="宋體" lang="ZH-CN">方法實現。</p>
<p> </font><font face="Arial">1. Create</font><font face="宋體" lang="ZH-CN">方法和</font><font
face="Arial">Destroy</font><font face="宋體" lang="ZH-CN">方法的實現</p>
<p> </font><font face="Arial">Create</font><font face="宋體" lang="ZH-CN">方法的功能主要是建立</font><font
face="Arial">BlobStream</font><font face="宋體" lang="ZH-CN">流與</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">字段的聯系并初始化某些私有變量。其實現如下:</p>
<p> </p>
<p></font><font face="Arial">constructor TBlobStream.Create(Field: TBlobField; Mode:
TBlobStreamMode);</p>
<p>var</p>
<p>OpenMode: DbiOpenMode;</p>
<p>begin</p>
<p>FField := Field;</p>
<p>FDataSet := Field.DataSet;</p>
<p>FRecord := FDataSet.ActiveBuffer;</p>
<p>FFieldNo := Field.FieldNo;</p>
<p>if FDataSet.State = dsFilter then</p>
<p>DBErrorFmt(SNoFieldAccess, [FField.DisplayName]);</p>
<p>if not FField.FModified then</p>
<p>begin</p>
<p>if Mode = bmRead then</p>
<p>begin</p>
<p>FBuffer := AllocMem(FDataSet.RecordSize);</p>
<p>FRecord := FBuffer;</p>
<p>if not FDataSet.GetCurrentRecord(FBuffer) then Exit;</p>
<p>OpenMode := dbiReadOnly;</p>
<p>end else</p>
<p>begin</p>
<p>if not (FDataSet.State in [dsEdit, dsInsert]) then DBError(SNotEditing);</p>
<p>OpenMode := dbiReadWrite;</p>
<p>end;</p>
<p>Check(DbiOpenBlob(FDataSet.Handle, FRecord, FFieldNo, OpenMode));</p>
<p>end;</p>
<p>FOpened := True;</p>
<p>if Mode = bmWrite then Truncate;</p>
<p>end;</p>
<p> </p>
<p></font><font face="宋體" lang="ZH-CN"> 該方法首先是用傳入的</font><font
face="Arial">Field</font><font face="宋體" lang="ZH-CN">參數給</font><font
face="Arial">FField</font><font face="宋體" lang="ZH-CN">,</font><font face="Arial">FDataSet</font><font
face="宋體" lang="ZH-CN">,</font><font face="Arial">FRecord</font><font face="宋體"
lang="ZH-CN">和</font><font face="Arial">FFieldNo</font><font face="宋體" lang="ZH-CN">賦值。方法中用</font><font
face="Arial">AllocMem</font><font face="宋體" lang="ZH-CN">按當前記錄大小分配內存,并將指針賦給</font><font
face="Arial">FBuffer</font><font face="宋體" lang="ZH-CN">,用</font><font
face="Arial">DataSet</font><font face="宋體" lang="ZH-CN">部件的</font><font
face="Arial">GetCurrentRecord</font><font face="宋體" lang="ZH-CN">方法,將記錄的值賦給</font><font
face="Arial">FBuffer</font><font face="宋體" lang="ZH-CN">,但不包括</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">數據。</p>
<p> 方法中用到的</font><font face="Arial">DbiOpenBlob</font><font face="宋體"
lang="ZH-CN">函數是</font><font face="Arial">BDE</font><font face="宋體" lang="ZH-CN">的</font><font
face="Arial">API</font><font face="宋體" lang="ZH-CN">函數,該函數用于打開數據庫中的</font><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -