?? 051.htm
字號:
face="Arial">ReadResHeader</font><font face="宋體" lang="ZH-CN">將引發一個</font><font
face="Arial">EInvalidImage</font><font face="宋體" lang="ZH-CN">異常事件。在</font><font
face="Arial">Classes</font><font face="宋體" lang="ZH-CN">庫單元中也包含一個名為</font><font
face="Arial">ReadComponentRes</font><font face="宋體" lang="ZH-CN">的函數,該函數執行相同的操作,只不過它基于應用程序包含的資源建立自己的流。</p>
<p> </font><font face="Arial">8. ReadResHeader</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure ReadResHeader; </p>
<p>ReadResHeader</font><font face="宋體" lang="ZH-CN">方法從流的當前位置讀取</font><font
face="Arial">Windows</font><font face="宋體" lang="ZH-CN">資源文件頭,并將流的當前位置指針移到該文件頭的尾部。如果流不包含一個有效的資源文件頭,</font><font
face="Arial">ReadResHeader</font><font face="宋體" lang="ZH-CN">將引發一個</font><font
face="Arial">EInvalidImage</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">方法,因此,通常程序員通常不需要自己調用它。</p>
<p> </font><font face="Arial">9. Seek</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Seek(Offset: Longint; Origin: Word):
Longint; virtual; abstract; </p>
<p>Seek</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">Offset</font><font face="宋體" lang="ZH-CN">是負數,</font><font
face="Arial">Seek</font><font face="宋體" lang="ZH-CN">方法將從所描述的起點往流的頭部移動。下表中列出了</font><font
face="Arial">Origin</font><font face="宋體" lang="ZH-CN">的不同取值和它們的含義:</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">表</font><font face="Arial">20.1 </font><font
face="宋體" lang="ZH-CN">函數</font><font face="Arial">Seek</font><font face="宋體"
lang="ZH-CN">的參數的取值</p>
<p> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> 常量 值 </font> <font face="宋體" lang="ZH-CN"> </font><font
face="Arial">Seek</font><font face="宋體" lang="ZH-CN">的起點</font> <font
face="Arial">Offset</font><font face="宋體" lang="ZH-CN">的取值</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">─────────────────────────────────</p>
<p> </font><font face="Arial">SoFromBeginning 0 </font><font face="宋體" lang="ZH-CN"> 流的開頭</font>
<font face="宋體" lang="ZH-CN">正</font> <font face="宋體" lang="ZH-CN">數</p>
<p> </font><font face="Arial">SoFromCurrent 1 </font><font face="宋體" lang="ZH-CN">流的當前位置</font>
<font face="宋體" lang="ZH-CN">正數或負數</font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">SoFromEnd 2 </font><font face="宋體" lang="ZH-CN">流的結尾</font>
<font face="宋體" lang="ZH-CN">負</font> <font face="宋體" lang="ZH-CN">數</p>
<p> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</font><font
face="Arial"></p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font> <font face="Arial">10. Write</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 在</font><font face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">對象式管理的對象中有兩類對象的方法都有稱為</font><font
face="Arial">Write</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">Stream</font><font
face="宋體" lang="ZH-CN">對象的</font><font face="Arial">Write</font><font
face="宋體" lang="ZH-CN">方法將數據寫進流中。</font><font face="Arial">Filer</font><font
face="宋體" lang="ZH-CN">對象通過相關的流傳遞數據,在后文中會介紹這類方法。</p>
<p> </font><font face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="Arial">Write</font><font face="宋體" lang="ZH-CN">方法聲明如下:</p>
<p> </font><font face="Arial"></p>
<p>function Write(const Buffer; Count: Longint): Longint; virtual; abstract; </p>
<p></font> <font face="Arial"></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">Count</font><font face="宋體" lang="ZH-CN">個字節,函數返回寫入的字節數。</p>
<p> </font> <font face="Arial">TStream</font><font face="宋體" lang="ZH-CN">的</font><font
face="Arial">Write</font><font face="宋體" lang="ZH-CN">方法是抽象的,每個繼承的</font><font
face="Arial">Stream</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">(</font><font face="宋體" lang="ZH-CN">如</font><font face="Arial">WriteBuffer</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">WriteComponent)</font><font
face="宋體" lang="ZH-CN">都調用</font><font face="Arial">Write</font><font
face="宋體" lang="ZH-CN">擔當實際的寫操作。</p>
<p> </font><font face="Arial">11. WriteBuffer</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure WriteBuffer(const Buffer; Count:
Longint); </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteBuffer</font><font face="宋體" lang="ZH-CN">的功能與</font><font
face="Arial">Write</font><font face="宋體" lang="ZH-CN">相似。</font><font
face="Arial">WriteBuffer</font><font face="宋體" lang="ZH-CN">方法調用</font><font
face="Arial">Write</font><font face="宋體" lang="ZH-CN">來執行實際的寫操作,如果流沒能寫所有字節,</font><font
face="Arial">WriteBuffer</font><font face="宋體" lang="ZH-CN">會觸發一個</font><font
face="Arial">EWriteError</font><font face="宋體" lang="ZH-CN">異常事件。</p>
<p> </font><font face="Arial">12. WriteComponent</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">WriteComponent</font><font face="宋體" lang="ZH-CN">的方法。</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="Arial">WriteComponent</font><font face="宋體" lang="ZH-CN">方法將</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">所指定的部件和它所包含的所有部件都寫入流中;</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="Arial">WriteComponent</font><font face="宋體" lang="ZH-CN">將指定部件的屬性值寫入</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對象的流中。</p>
<p> </font><font face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="Arial">WriteComponent</font><font face="宋體" lang="ZH-CN">方法聲明是這樣的:</font><font
face="Arial"></p>
<p>procedure WriteComponent(Instance: Tcomponent); </p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteComponent</font><font face="宋體" lang="ZH-CN">創建一個</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對象,并調用</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">的</font><font face="Arial">WriteRootComponent</font><font
face="宋體" lang="ZH-CN">方法將</font><font face="Arial">Instance</font><font
face="宋體" lang="ZH-CN">及其擁有的對象寫入流。</p>
<p> </font><font face="Arial">13. WriteComponentRes</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">WriteComponentRes(const ResName: String;
Instance: TComponent); </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteComponentRes</font><font face="宋體"
lang="ZH-CN">方法首先往流中寫入標準</font><font face="Arial">Windows </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">寫入的部件,必須調用</font><font
face="Arial">ReadComponentRes</font><font face="宋體" lang="ZH-CN">方法。</p>
<p> </font><font face="Arial">WriteComponentRes</font><font face="宋體"
lang="ZH-CN">使用</font><font face="Arial">ResName</font><font face="宋體"
lang="ZH-CN">傳入的字符串作為資源文件頭的資源名,然后調用</font><font
face="Arial">WriteComponent</font><font face="宋體" lang="ZH-CN">方法將</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">和它擁有的部件寫入流。</p>
<p> </font><font face="Arial">14. WriteDescendant</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure WriteDescendant(Instance Ancestor:
TComponent); </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="Arial">WriteDescendant</font><font face="宋體" lang="ZH-CN">方法創建一個</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對象,然后調入該對象的</font><font
face="Arial">WriteDescendant</font><font face="宋體" lang="ZH-CN">方法將</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">部件寫入流中。</font><font
face="Arial">Instance</font><font face="宋體" lang="ZH-CN">可以是從</font><font
face="Arial">Ancestor</font><font face="宋體" lang="ZH-CN">部件繼承的窗體,也可以是在從祖先窗體中繼承的窗體中相應于祖先窗體中</font><font
face="Arial">Ancestor</font><font face="宋體" lang="ZH-CN">部件的部件。</p>
<p> </font><font face="Arial">15. WriteDescendantRes</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure WriteDescendantRes(const ResName:
String;</p>
<p>Instance, Ancestor: TComponent);</font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteDescendantRes</font><font face="宋體"
lang="ZH-CN">方法將</font><font face="Arial">Windows</font><font face="宋體"
lang="ZH-CN">資源文件頭寫入流,并使用</font><font face="Arial">ResName</font><font
face="宋體" lang="ZH-CN">作用資源名,然后調用</font><font face="Arial">WriteDescendant</font><font
face="宋體" lang="ZH-CN">方法,將</font><font face="Arial">Instance</font><font
face="宋體" lang="ZH-CN">寫入流。</p>
<p> </font><font face="Arial"></p>
<p>20.1.1.2 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">Stream</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">Read</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Write</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">Borland</font><font face="宋體" lang="ZH-CN">公司雖然提供了</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象的接口說明文檔,但對于其實現和應用方法卻沒有提及,筆者是從</font><font
face="Arial">Borland Delphi 2.0 Client/Server Suite </font><font face="宋體"
lang="ZH-CN">提供的源代碼和部分例子程序中掌握了流式對象技術。</p>
<p> 下面就從</font><font face="Arial">TStream</font><font face="宋體"
lang="ZH-CN">的屬性和方法的實現開始。</p>
<p> </font><font face="Arial">1. TStream</font><font face="宋體" lang="ZH-CN">屬性的實現</p>
<p> 前面介紹過,</font><font face="Arial">TStream</font><font face="宋體"
lang="ZH-CN">具有</font><font face="Arial">Position</font><font face="宋體"
lang="ZH-CN">和</font><font face="Arial">Size</font><font face="宋體" lang="ZH-CN">兩個屬性,作為抽象數據類型,它抽象了在各種存儲媒介中讀寫數據所需要經常訪問的域。那么它們是怎樣實現的呢?</p>
<p> 在自定義部件編寫這一章中介紹過部件屬性定義中的讀寫控制。</font><font
face="Arial">Position</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Size</font><font
face="宋體" lang="ZH-CN">也作了讀寫控制。定義如下:</p>
<p> </font><font face="Arial"></p>
<p>property Position: Longint read GetPosition write SetPosition;</p>
<p>property Size: Longint read GetSize;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> 由上可知,</font><font face="Arial">Position</font><font face="宋體"
lang="ZH-CN">是可讀寫屬性,而</font><font face="Arial">Size</font><font
face="宋體" lang="ZH-CN">是只讀的。</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -