?? 051.htm
字號:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基礎教程-->第二十章 開發Delphi對象式數據管理功能(一)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基礎教程 第二十章 開發Delphi對象式數據管理功能(一)">
<META NAME="description" CONTENT=" - DELPHI基礎教程 - 第二十章 開發Delphi對象式數據管理功能(一)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋體"}
.tt2 {font: 12pt/15pt "宋體"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" bgcolor="#e0e0e0"><strong><A HREF="052.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="050.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷體_GB2312">第二十章 開發Delphi對象式數據管理功能(一)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p> 面向對象技術是九十年代的主流技術,各類應用軟件如果以面向對象的方法構造并且滲透面向對象的風格將使軟件具有更高的品質。在面向對象程序設計中,對象式數據管理占有很重要的地位。在</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">中,對對象式數據管理的支持方式是其一大特色。</font><font
face="Arial"></p>
<p>Delphi</font><font face="宋體" lang="ZH-CN">是一個面向對象的可視化設計與面向對象的語言相結合的集成開發環境。</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">的核心是部件。部件是對象的一種。</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">應用程序完全是由部件來構造的,因此開發高性能的</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">應用程序必然會涉及對象式數據管理技術。</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">對象式數據管理包括兩方面的內容:</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">●</font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">用對象來管理數據</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">●</font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">對各類數據對象(包括對象和部件)的管理</font><font
face="Arial"></p>
<p></font> <font face="Arial"></p>
<p>Delphi</font><font face="宋體" lang="ZH-CN">在這兩方面都做的相當出色。在</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">的早期版本</font><font
face="Arial">Turbo Pascal </font><font face="宋體" lang="ZH-CN">中就曾有流</font><font
face="Arial">(Stream)</font><font face="宋體" lang="ZH-CN">、群</font><font
face="Arial">(Collection)</font><font face="宋體" lang="ZH-CN">和資源</font><font
face="Arial">(Resource)</font><font face="宋體" lang="ZH-CN">等專門用于對象式數據管理的類。在</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">中,這些功能得到了大大的加強。</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">將對象式數據管理類歸結為</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象</font><font face="Arial">(Stream)</font><font
face="宋體" lang="ZH-CN">和</font><font face="Arial">Filer</font><font face="宋體"
lang="ZH-CN">對象</font><font face="Arial">(Filer)</font><font face="宋體"
lang="ZH-CN">,并將它們應用于可視部件類庫(</font><font face="Arial">VCL</font><font
face="宋體" lang="ZH-CN">)的方方面面。它們不僅提供了在內存、外存和</font><font
face="Arial">Windows</font><font face="宋體" lang="ZH-CN">資源中管理對象的功能,還提供了在數據庫</font><font
face="Arial">BLOB</font><font face="宋體" lang="ZH-CN">字段中對象的功能。</p>
<p> 在本章中將介紹</font><font face="Arial">Stream</font><font face="宋體"
lang="ZH-CN">對象和</font><font face="Arial">Filer</font><font face="宋體"
lang="ZH-CN">對象的實現原理、應用方法以及在超媒體系統中的應用。這對于運用</font><font
face="Arial">Delphi </font><font face="宋體" lang="ZH-CN">開發高級應用是很重要的。</p>
<p> </font><font face="Arial"></p>
<p>20.1 </font><font face="宋體" lang="ZH-CN">流式對象的實現原理和應用</p>
<p> </p>
<p> </font><font face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象,又稱流式對象,是</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">、</font><font face="Arial">THandleStream</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">TFileStream</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">TMemoryStream</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">TResourceStream</font><font
face="宋體" lang="ZH-CN">和</font><font face="Arial">TBlobStream</font><font
face="宋體" lang="ZH-CN">等的統稱。它們分別代表了在各種媒介上存儲數據的能力,它們將各種數據類型</font><font
face="Arial">(</font><font face="宋體" lang="ZH-CN">包括對象和部件</font><font
face="Arial">) </font><font face="宋體" lang="ZH-CN">在內存、外存和數據庫字段中的管理操作抽象為對象方法,并且充分利用了面向對象技術的優點,應用程序可以相當容易地在各種</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象中拷貝數據。</p>
<p> 下面介紹各種對象的數據和方法及使用方法。</p>
<p> </font><font face="Arial"></p>
<p>20.1.1 TStream</font><font face="宋體" lang="ZH-CN">對象</p>
<p> </p>
<p> </font><font face="Arial">TStream</font><font face="宋體" lang="ZH-CN">對象是能在各種媒介中存儲二進制數據的對象的抽象對象。從</font><font
face="Arial">TStream </font><font face="宋體" lang="ZH-CN">對象繼承的對象用于在內存、</font><font
face="Arial">Windows</font><font face="宋體" lang="ZH-CN">資源文件、磁盤文件和數據庫字段等媒介中存儲數據。</p>
<p> </font><font face="Arial">TStream</font><font face="宋體" lang="ZH-CN">中定義了兩個屬性:</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Position</font><font
face="宋體" lang="ZH-CN">。它們分別以字節為單位表示的流的大小和當前指針位置。</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">中定義的方法用于在各種流中讀、寫和相互拷貝二進制數據。因為所有的</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象都是從</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">中繼承來的,所以在</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">中定義的域和方法都能被</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象調用和訪問。此外,又由于面向對象技術的動態聯編功能,</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">為各種流的應用提供了統一的接口,簡化了流的使用;不同</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象是抽象了對不同存儲媒介的數據上的操作,因此,</font><font
face="Arial">TStream</font><font face="宋體" lang="ZH-CN">的需方法為在不同媒介間的數據拷貝提供了最簡捷的手段。</p>
<p> </font><font face="Arial"></p>
<p>20.1.1.1 TStream</font><font face="宋體" lang="ZH-CN">的屬性和方法</p>
<p> </p>
<p> </font><font face="Arial">1. Position</font><font face="宋體" lang="ZH-CN">屬性 </font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">聲明:</font><font face="Arial">property
Position: Longint; </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Position</font><font face="宋體" lang="ZH-CN">屬性指明流中讀寫的當前偏移量。</p>
<p> </font><font face="Arial">2. Size</font><font face="宋體" lang="ZH-CN">屬性</p>
<p> 聲明:</font><font face="Arial">property Size: Longint; </p>
<p>Size</font><font face="宋體" lang="ZH-CN">屬性指明了以字節為單位的流的的大小,它是只讀的。</p>
<p> </font><font face="Arial">3. CopyFrom</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function CopyFrom(Source: TStream; Count:
Longint): Longint; </p>
<p>CopyFrom</font><font face="宋體" lang="ZH-CN">從</font><font face="Arial">Source</font><font
face="宋體" lang="ZH-CN">所指定的流中拷貝</font><font face="Arial">Count</font><font
face="宋體" lang="ZH-CN">個字節到當前流中,</font> <font face="宋體"
lang="ZH-CN">并將指針從當前位置移動</font><font face="Arial">Count</font><font
face="宋體" lang="ZH-CN">個字節數,函數返回值是實際拷貝的字節數。</p>
<p> </font><font face="Arial">4. Read</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Read(var Buffer; Count: Longint):
Longint; virtual; abstract; </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">Count</font><font face="宋體" lang="ZH-CN">個字節數,函數返回值是實際讀的字節數。如果返回值小于</font><font
face="Arial">Count</font><font face="宋體" lang="ZH-CN">,這意味著讀操作在讀滿所需字節數前指針已經到達了流的尾部。</p>
<p> </font><font face="Arial">Read</font><font face="宋體" lang="ZH-CN">方法是抽象方法。每個后繼</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象都要根據自己特有的有關特定存儲媒介的讀操作覆蓋該方法。而且流的所有其它的讀數據的方法(如:</font><font
face="Arial">ReadBuffer</font><font face="宋體" lang="ZH-CN">,</font><font
face="Arial">ReadComponent</font><font face="宋體" lang="ZH-CN">等)在完成實際的讀操作時都調用了</font><font
face="Arial">Read</font><font face="宋體" lang="ZH-CN">方法。面向對象的動態聯編的優點就體現在這兒。因為后繼</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象只需覆蓋</font><font
face="Arial">Read</font><font face="宋體" lang="ZH-CN">方法,而其它讀操作</font><font
face="Arial">(</font><font face="宋體" lang="ZH-CN">如</font><font face="Arial">ReadBuffer</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">ReadComponent</font><font
face="宋體" lang="ZH-CN">等</font><font face="Arial">)</font><font face="宋體"
lang="ZH-CN">都不需要重新定義,而且</font><font face="Arial">TStream</font><font
face="宋體" lang="ZH-CN">還提供了統一的接口。</p>
<p> </font><font face="Arial">5. ReadBuffer</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadBuffer(var Buffer; Count:
Longint); </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">ReadBuffer</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="宋體" lang="ZH-CN">并將流的當前指針向后移動</font><font face="Arial">Count</font><font
face="宋體" lang="ZH-CN">個字節。如讀操作超過流的尾部,</font><font
face="Arial">ReadBuffer</font><font face="宋體" lang="ZH-CN">方法引起</font><font
face="Arial">EReadError</font><font face="宋體" lang="ZH-CN">異常事件。</p>
<p> </font><font face="Arial">6. ReadComponent</font><font face="宋體" lang="ZH-CN">方法</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font> <font face="宋體" lang="ZH-CN">聲明:</font><font
face="Arial">function ReadComponent(Instance: TComponent): TComponent; </p>
<p>ReadComponent</font><font face="宋體" lang="ZH-CN">方法從當前流中讀取由</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">所指定的部件,函數返回所讀的部件。</font><font
face="Arial">ReadComponent</font><font face="宋體" lang="ZH-CN">在讀</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">及其擁有的所有對象時創建了一個</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象并調用它的</font><font
face="Arial">ReadRootComponent</font><font face="宋體" lang="ZH-CN">方法。</p>
<p> 如果</font><font face="Arial">Instance</font><font face="宋體" lang="ZH-CN">為</font><font
face="Arial">nil</font><font face="宋體" lang="ZH-CN">,</font><font face="Arial">ReadComponent</font><font
face="宋體" lang="ZH-CN">的方法基于流中描述的部件類型信息創建部件,并返回新創建的部件。</p>
<p> </font><font face="Arial">7. ReadComponentRes</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function ReadComponentRes(Instance:
TComponent): TComponent; </p>
<p>ReadComponentRes</font><font face="宋體" lang="ZH-CN">方法從流中讀取</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">指定的部件,但是流的當前位置必須是由</font><font
face="Arial">WriteComponentRes</font><font face="宋體" lang="ZH-CN">方法所寫入的部件的位置。</p>
<p> </font><font face="Arial">ReadComponentRes </font><font face="宋體"
lang="ZH-CN">首先調用</font><font face="Arial">ReadResHeader</font><font face="宋體"
lang="ZH-CN">方法從流中讀取資源頭,然后調用</font><font face="Arial">ReadComponent</font><font
face="宋體" lang="ZH-CN">方法讀取</font><font face="Arial">Instance</font><font
face="宋體" lang="ZH-CN">。如果流的當前位置不包含一個資源頭。</font><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -