?? 054.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="055.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="053.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%">
<font face="Arial"><p>20.2.3 TReader</font><font face="宋體" lang="ZH-CN">對象 </p>
<p> </font><font face="Arial">TReader</font><font face="宋體" lang="ZH-CN">對象是可實例化的用于從相聯系的流中讀取數據的</font><font
face="Arial">Filer</font><font face="宋體" lang="ZH-CN">對象。</font><font
face="Arial">TReader</font><font face="宋體" lang="ZH-CN">對象從</font><font
face="Arial">TFiler</font><font face="宋體" lang="ZH-CN">繼承下來,除了從</font><font
face="Arial">TFiler</font><font face="宋體" lang="ZH-CN">繼承的屬性和方法外,</font><font
face="Arial">TReader</font><font face="宋體" lang="ZH-CN">聲明了不少屬性、方法和事件。</p>
<p> </font> <font face="Arial">Owner</font><font face="宋體" lang="ZH-CN">和</font><font
face="Arial">Parent</font><font face="宋體" lang="ZH-CN">屬性用于表示從</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象的流中讀取的部件的擁有者和雙親結點。</font><font
face="Arial">OnError</font><font face="宋體" lang="ZH-CN">,</font><font face="Arial">OnFindMethod</font><font
face="宋體" lang="ZH-CN">和</font><font face="Arial">OnSetName</font><font
face="宋體" lang="ZH-CN">事件使應用程序在運行中讀數據時能定制響應方式。除了覆蓋了一些從</font><font
face="Arial">TFiler</font><font face="宋體" lang="ZH-CN">對象中繼承的方法外,</font><font
face="Arial">TReader</font><font face="宋體" lang="ZH-CN">對象還定義大量的讀不同類型的數據和觸發事件的方法。</p>
<p> </font><font face="Arial"></p>
<p>20.2.3.1 TReader</font><font face="宋體" lang="ZH-CN">對象的屬性和方法</p>
<p> </p>
<p> </font><font face="Arial">1. Owner</font><font face="宋體" lang="ZH-CN">屬性</p>
<p> 聲明:</font><font face="Arial">property Owner: TComponent; </p>
<p>Reader</font><font face="宋體" lang="ZH-CN">對象的</font><font face="Arial">Owner</font><font
face="宋體" lang="ZH-CN">屬性存儲了將用來給從</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">的流中讀出的部件的</font><font face="Arial">Owner</font><font
face="宋體" lang="ZH-CN">屬性賦值的部件。</p>
<p> </font><font face="Arial">2. Parent</font><font face="宋體" lang="ZH-CN">屬性</p>
<p> 聲明:</font><font face="Arial">property Parent: TComponent; </p>
<p>Parent</font><font face="宋體" lang="ZH-CN">屬性存儲將用來給從</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">的流中讀出所有控制的</font><font
face="Arial">Parent</font><font face="宋體" lang="ZH-CN">屬性賦值的部件。</p>
<p> </font><font face="Arial">3. Position</font><font face="宋體" lang="ZH-CN">屬性</p>
<p> 聲明:</font><font face="Arial">propertion: Longint; </p>
<p>Reader</font><font face="宋體" lang="ZH-CN">對象的</font><font face="Arial">Position</font><font
face="宋體" lang="ZH-CN">屬性表示相聯的流中讀的當前位置。</font><font
face="Arial">Position</font><font face="宋體" lang="ZH-CN">的值還應包括讀緩沖區的大小。對于</font><font
face="Arial">Reader </font><font face="宋體" lang="ZH-CN">對象,</font><font
face="Arial">Position</font><font face="宋體" lang="ZH-CN">的值大于流的</font><font
face="Arial">Position </font><font face="宋體" lang="ZH-CN">的值。如果將</font><font
face="Arial">Position</font><font face="宋體" lang="ZH-CN">的值設得超過當前緩沖區,將引起調用</font><font
face="Arial">FlushBuffer</font><font face="宋體" lang="ZH-CN">。</p>
<p> </font><font face="Arial">4. BeginReferences</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure BeginReferences; </p>
<p>BeginReferences</font><font face="宋體" lang="ZH-CN">方法啟動一連串關于讀部件的命令,這些部件包含相互間的交叉引用。在使用上通常和</font><font
face="Arial">FixupReferences</font><font face="宋體" lang="ZH-CN">和</font><font
face="Arial">EndReferences</font><font face="宋體" lang="ZH-CN">一起放在</font><font
face="Arial">Try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">finally</font><font
face="宋體" lang="ZH-CN">程序塊中。</p>
<p> 在調用了</font><font face="Arial">BeginReferences</font><font face="宋體"
lang="ZH-CN">后,</font><font face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象創建讀取所有對象和名字的列表。所有的獨立對象被讀出后,調用</font><font
face="Arial">FixupReferences</font><font face="宋體" lang="ZH-CN">方法將名字的相互從流中轉移到對象實例中。最后調用</font><font
face="Arial">EndReferences</font><font face="宋體" lang="ZH-CN">方法釋放列表。</p>
<p> 處理部件相互引用的程序塊形式如下:</p>
<p> </p>
<p></font><font face="Arial">BeginReferences; { </font><font face="宋體" lang="ZH-CN">創建臨時列表</font>
<font face="Arial">}</p>
<p>try</p>
<p>{ </font><font face="宋體" lang="ZH-CN">讀出所有部件并將它們的名字放在一臨時列表中</font>
<font face="Arial">}</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">FixupReferences; { </font><font face="宋體" lang="ZH-CN">分</font>
<font face="宋體" lang="ZH-CN">解</font> <font face="Arial">}</p>
<p>finally</p>
<p>EndReferences; { </font><font face="宋體" lang="ZH-CN">釋放臨時列表</font> <font
face="Arial">}</p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">5. FixUpReferences</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure FixupReferences; </p>
<p>FixupReferences</font><font face="宋體" lang="ZH-CN">方法分解從流中讀出的存在各種相互依賴部件的引用關系。</font><font
face="Arial">FixupReferences</font><font face="宋體" lang="ZH-CN">總在</font><font
face="Arial">try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">finally</font><font
face="宋體" lang="ZH-CN">塊中并配合</font><font face="Arial">BeginReferences</font><font
face="宋體" lang="ZH-CN">和</font><font face="Arial">EndReferences</font><font
face="宋體" lang="ZH-CN">一起使用。</p>
<p> </font><font face="Arial">6. EndReferences</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure EndReferences; </p>
<p>EndReferences</font><font face="宋體" lang="ZH-CN">方法終止處理相互引用的塊操作,釋放對象列表。它總配合</font><font
face="Arial">BeginReferences</font><font face="宋體" lang="ZH-CN">和</font><font
face="Arial">FixupReferences</font><font face="宋體" lang="ZH-CN">一起使用。</p>
<p> </font><font face="Arial">7. ReadListBegin</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadListBegin; </p>
<p>ReadListBegin</font><font face="宋體" lang="ZH-CN">方法從</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象相聯的流中讀取列表開始標志。如果流中緊接著要讀取的項目不是一個由</font><font
face="Arial">WritelistBegin</font><font face="宋體" lang="ZH-CN">方法寫入的列表起始標志,</font><font
face="Arial">ReadListBegin</font><font face="宋體" lang="ZH-CN">將引起一個讀異常事件。</p>
<p> 通常在調用</font><font face="Arial">ReadlistBegin</font><font face="宋體"
lang="ZH-CN">方法之后,緊跟著一個讀項目的循環,循環以</font><font
face="Arial">EndfList</font><font face="宋體" lang="ZH-CN">方法返回</font><font
face="Arial">True </font><font face="宋體" lang="ZH-CN">終止條件。這時,預示流中的下一個項目是列表結束標志,需要調用</font><font
face="Arial">ReadListEnd</font><font face="宋體" lang="ZH-CN">方法。</p>
<p> </font><font face="Arial">8. ReadListEnd</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadListEnd; </p>
<p>ReadListEnd </font><font face="宋體" lang="ZH-CN">方法從流中讀取列表結束標志。如果所讀的項目不是一個列表結束標志,</font><font
face="Arial">ReadListEnd</font><font face="宋體" lang="ZH-CN">方法引發一個</font><font
face="Arial">EReadError</font><font face="宋體" lang="ZH-CN">異常事件。</p>
<p> </font><font face="Arial">9. EndOfList</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function EndOfList: Boolean; </p>
<p></font><font face="宋體" lang="ZH-CN">如果</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象讀到項目列表結果標志,</font><font
face="Arial">EndOfList</font><font face="宋體" lang="ZH-CN">方法返回</font><font
face="Arial">True</font><font face="宋體" lang="ZH-CN">。</p>
<p> </font><font face="Arial">TStrings</font><font face="宋體" lang="ZH-CN">對象在從</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象讀取項目列表時使用了</font><font
face="Arial">ReadListBegin</font><font face="宋體" lang="ZH-CN">和</font><font
face="Arial">ReadListEnd</font><font face="宋體" lang="ZH-CN">方法。下面的</font><font
face="Arial">ReadData</font><font face="宋體" lang="ZH-CN">是</font><font face="Arial">TStrings</font><font
face="宋體" lang="ZH-CN">的方法,用于在</font><font face="Arial">DefineProperties</font><font
face="宋體" lang="ZH-CN">方面中讀</font><font face="Arial">string</font><font
face="宋體" lang="ZH-CN">數據。</p>
<p> </p>
<p></font><font face="Arial">procedure TStrings.ReadData(Reader: TReader);</p>
<p>begin</p>
<p>Reader.ReadListBegin; { </font><font face="宋體" lang="ZH-CN">讀列表開始標志</font>
<font face="Arial">}</p>
<p>Clear; { </font><font face="宋體" lang="ZH-CN">清除已有的字符串</font> <font
face="Arial">}</p>
<p>while not Reader.EndOfList do { </font><font face="宋體" lang="ZH-CN">只要還有數據</font>
<font face="宋體" lang="ZH-CN">…</font><font face="Arial"> }</p>
<p>Add(Reader.ReadString); { </font><font face="宋體" lang="ZH-CN">…讀一個字符串并將其加在列表中</font>
<font face="Arial">}</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">Reader.ReadListEnd; { </font><font face="宋體" lang="ZH-CN">越過列表結束標志</font>
<font face="Arial">}</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">end;</p>
<p></font> <font face="Arial"></p>
<p>10. ReadSignature</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadSignature; </p>
<p>ReadSignature</font><font face="宋體" lang="ZH-CN">方法從流中讀取部件之前首先調用</font><font
face="Arial">ReadSignature</font><font face="宋體" lang="ZH-CN">方法。在載入對象之前檢測標簽。</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象就能防止疏忽大意,導致讀取無效或過時的數據。</font><font
face="Arial">Filer</font><font face="宋體" lang="ZH-CN">標簽是四個字符,對于</font><font
face="Arial">Delphi 2.0</font><font face="宋體" lang="ZH-CN">,該標簽是“</font><font
face="Arial">TPF0</font><font face="宋體" lang="ZH-CN">”。</p>
<p> </font><font face="Arial">11. ReadPrefix</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadPrefix(var Plags: TFilerFlags;
var AChild, Pos: Integer); </p>
<p>ReadPrefix</font><font face="宋體" lang="ZH-CN">方法的功能與</font><font
face="Arial">ReadSignature</font><font face="宋體" lang="ZH-CN">的很相象,只不過它是讀取流中部件前面的標志</font><font
face="Arial">(PreFix)</font><font face="宋體" lang="ZH-CN">。當一個</font><font
face="Arial">Write</font><font face="宋體" lang="ZH-CN">對象將部件寫入流中時,它在部件前面預寫了兩個值,第一個值是指明部件是否是從祖先窗體中繼承的窗體和它在窗體中的位置是否重要的標志</font><font
face="Arial">;</font><font face="宋體" lang="ZH-CN">第二個值指明它在祖先窗體創建次序。</font><font
face="Arial">ReadComponent</font><font face="宋體" lang="ZH-CN">方法自動調用</font><font
face="Arial">ReadPrefix</font><font face="宋體" lang="ZH-CN">。但如果需要獨立讀取部件的預讀標志,也可直接調用該方向。</p>
<p> </font><font face="Arial">12. OnFindMethod</font><font face="宋體" lang="ZH-CN">事件</p>
<p> 聲明:</font><font face="Arial">property OnFindMethod: TFindMethodEvent; </p>
<p>OnFindMethod</font><font face="宋體" lang="ZH-CN">事件,發生在</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象讀取對象的方法指針時,屬性為方法指針的通常都是事件。</p>
<p> 響應</font><font face="Arial">OnFindMethod</font><font face="宋體"
lang="ZH-CN">事件的理由,通常是處理過程找不到方法的情況。在</font><font
face="Arial">FindMethod</font><font face="宋體" lang="ZH-CN">方法沒有找到由</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">指定的方法的情況下,如果它將</font><font
face="Arial">OnFindMethod</font><font face="宋體" lang="ZH-CN">方法的</font><font
face="Arial">Error </font><font face="宋體" lang="ZH-CN">參數設為</font><font
face="Arial">True</font><font face="宋體" lang="ZH-CN">,將引起</font><font
face="Arial">ReadError</font><font face="宋體" lang="ZH-CN">異常事件;反之,將</font><font
face="Arial">Error</font><font face="宋體" lang="ZH-CN">參數置為</font><font
face="Arial">False</font><font face="宋體" lang="ZH-CN">,將防止</font><font
face="Arial">FindMethod</font><font face="宋體" lang="ZH-CN">方法引發異常事件。</p>
<p> </font><font face="Arial">13. Error</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Error(const Message: String):
Boolean; virtual; </p>
<p>Error</font><font face="宋體" lang="ZH-CN">方法定義在</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象的</font><font face="Arial">protected</font><font
face="宋體" lang="ZH-CN">部分,它是用于</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象的</font><font face="Arial">OnError</font><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -