📄 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 + -