?? 053.htm
字號(hào):
<p> </font><font face="Arial"></p>
<p>20.2.2.2 TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象的實(shí)現(xiàn)</p>
<p> </p>
<p> </font><font face="Arial">TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象提供了許多往流中寫各種類型數(shù)據(jù)的方法,這對(duì)于程序員來說是很重要的功能。</font><font
face="Arial">TWrite</font><font face="宋體" lang="ZH-CN">對(duì)象往流中寫數(shù)據(jù)是依據(jù)不同的數(shù)據(jù)采取不同的格式的。</font>
<font face="宋體" lang="ZH-CN">因此要掌握</font><font face="Arial">TWriter</font><font
face="宋體" lang="ZH-CN">對(duì)象的實(shí)現(xiàn)和應(yīng)用方法,必須了解</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對(duì)象存儲(chǔ)數(shù)據(jù)的格式。</p>
<p> 首先要說明的是,每個(gè)</font><font face="Arial">Filer</font><font
face="宋體" lang="ZH-CN">對(duì)象的流中都包含有</font><font face="Arial">Filer</font><font
face="宋體" lang="ZH-CN">對(duì)象標(biāo)簽。該標(biāo)簽占四個(gè)字節(jié)其值為“</font><font
face="Arial">TPF0</font><font face="宋體" lang="ZH-CN">”。</font><font face="Arial">Filer</font><font
face="宋體" lang="ZH-CN">對(duì)象為</font><font face="Arial">WriteSignature</font><font
face="宋體" lang="ZH-CN">和</font><font face="Arial">ReadSignature</font><font
face="宋體" lang="ZH-CN">方法存取該標(biāo)簽。該標(biāo)簽主要用于</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對(duì)象讀數(shù)據(jù)</font><font
face="Arial">(</font><font face="宋體" lang="ZH-CN">部件等</font><font face="Arial">)</font><font
face="宋體" lang="ZH-CN">時(shí),指導(dǎo)讀操作。</p>
<p> 其次,</font><font face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對(duì)象在存儲(chǔ)數(shù)據(jù)前都要留一個(gè)字節(jié)的標(biāo)志位,以指出后面存放的是什么類型的數(shù)據(jù)。該字節(jié)為</font><font
face="Arial">TValueType</font><font face="宋體" lang="ZH-CN">類型的值。</font><font
face="Arial">TValueType</font><font face="宋體" lang="ZH-CN">是枚舉類型,占一個(gè)字節(jié)空間,其定義如下:</p>
<p> </p>
<p> </font><font face="Arial">TValueType = (VaNull, VaList, VaInt8, VaInt16, VaInt32,
VaEntended, VaString, VaIdent, </p>
<p>VaFalse, VaTrue, VaBinary, VaSet, VaLString, VaNil, VaCollection); </p>
<p></font> <font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">因此,對(duì)</font><font face="Arial">Writer</font><font
face="宋體" lang="ZH-CN">對(duì)象的每一個(gè)寫數(shù)據(jù)方法,在實(shí)現(xiàn)上,都要先寫標(biāo)志位再寫相應(yīng)的數(shù)據(jù)</font><font
face="Arial">;</font><font face="宋體" lang="ZH-CN">而</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對(duì)象的每一個(gè)讀數(shù)據(jù)方法都要先讀標(biāo)志位進(jìn)行判斷,如果符合就讀數(shù)據(jù),否則產(chǎn)生一個(gè)讀數(shù)據(jù)無效的異常事件。</font><font
face="Arial">VaList</font><font face="宋體" lang="ZH-CN">標(biāo)志有著特殊的用途,它是用來標(biāo)識(shí)后面將有一連串類型相同的項(xiàng)目,而標(biāo)識(shí)連續(xù)項(xiàng)目結(jié)束的標(biāo)志是</font><font
face="Arial">VaNull</font><font face="宋體" lang="ZH-CN">。因此,在</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對(duì)象寫連續(xù)若干個(gè)相同項(xiàng)目時(shí),先用</font><font
face="Arial">WriteListBegin</font><font face="宋體" lang="ZH-CN">寫入</font><font
face="Arial">VaList</font><font face="宋體" lang="ZH-CN">標(biāo)志,寫完數(shù)據(jù)項(xiàng)目后,再寫出</font><font
face="Arial">VaNull</font><font face="宋體" lang="ZH-CN">標(biāo)志;而讀這些數(shù)據(jù)時(shí),以</font><font
face="Arial">ReadListBegin</font><font face="宋體" lang="ZH-CN">開始,</font><font
face="Arial">ReadListEnd</font><font face="宋體" lang="ZH-CN">結(jié)束,中間用</font><font
face="Arial">EndofList</font><font face="宋體" lang="ZH-CN">函數(shù)判斷是否有</font><font
face="Arial">VaNull</font><font face="宋體" lang="ZH-CN">標(biāo)志。</p>
<p> 下面就介紹它們的實(shí)現(xiàn)。</p>
<p> </font><font face="Arial">1. TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象屬性的實(shí)現(xiàn)</p>
<p> </font><font face="Arial">TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象直接從</font><font
face="Arial">TFiler</font><font face="宋體" lang="ZH-CN">對(duì)象繼承,它只增加了</font><font
face="Arial">Position</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">RootAncestor</font><font
face="宋體" lang="ZH-CN">屬性。</font><font face="Arial"></p>
<p>RootAncestor</font><font face="宋體" lang="ZH-CN">屬性在</font><font face="Arial">private</font><font
face="宋體" lang="ZH-CN">部分有數(shù)據(jù)域</font><font face="Arial">FRootAncestor</font><font
face="宋體" lang="ZH-CN">存入其值。在屬性定義的讀與控制上都是直接讀取該值。</p>
<p> </font><font face="Arial">Position</font><font face="宋體" lang="ZH-CN">屬性的定義中包含了兩個(gè)讀寫控制方法:</font><font
face="Arial">GetPosition</font><font face="宋體" lang="ZH-CN">和</font><font
face="Arial">SetPosition</font><font face="宋體" lang="ZH-CN">:</p>
<p> </p>
<p></font><font face="Arial">TWriter = class(TFiler)</p>
<p>private</p>
<p>FRootAncestor: TComponent;</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">function GetPosition: Longint;</p>
<p>procedure SetPosition(Value: Longint);</p>
<p>public</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">property Position: Longint read GetPosition write
SetPosition;</p>
<p>property RootAncestor: TComponent read FRootAncestor write FRootAncestor;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>GetPosition</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">SetPosition</font><font
face="宋體" lang="ZH-CN">方法實(shí)現(xiàn)如下:</p>
<p> </p>
<p></font><font face="Arial">function TWriter.GetPosition: Longint;</p>
<p>begin</p>
<p>Result := FStream.Position + FBufPos;</p>
<p>end;</font><font face="宋體" lang="ZH-CN"></p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.SetPosition(Value: Longint);</p>
<p>var</p>
<p>StreamPosition: Longint;</p>
<p>begin</p>
<p>StreamPosition := FStream.Position;</p>
<p>{ </font><font face="宋體" lang="ZH-CN">只清除越界的緩沖區(qū)</font> <font
face="Arial">}</p>
<p>if (Value < StreamPosition) or (Value > StreamPosition + FBufPos) then</p>
<p>begin</p>
<p>WriteBuffer;</p>
<p>FStream.Position := Value;</p>
<p>end</p>
<p>else FBufPos := Value - StreamPosition;</p>
<p>end; </p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteBuffer</font><font face="宋體" lang="ZH-CN">是</font><font
face="Arial">TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象定義的私有方法,它的作用是將</font><font
face="Arial">Writer </font><font face="宋體" lang="ZH-CN">對(duì)象內(nèi)部緩沖區(qū)中的有效數(shù)據(jù)寫入流中,并將</font><font
face="Arial">FBufPos</font><font face="宋體" lang="ZH-CN">置為</font><font
face="Arial">0</font><font face="宋體" lang="ZH-CN">。</font><font face="Arial">Writer</font><font
face="宋體" lang="ZH-CN">對(duì)象的</font><font face="Arial">FlushBuffer</font><font
face="宋體" lang="ZH-CN">對(duì)象就是用</font><font face="Arial">WriteBuffer</font><font
face="宋體" lang="ZH-CN">方法刷新緩沖區(qū)。</p>
<p> 在</font><font face="Arial">SetPosition</font><font face="宋體" lang="ZH-CN">方法中,如果</font><font
face="Arial">Value</font><font face="宋體" lang="ZH-CN">值超出了邊界</font><font
face="Arial">(FStream.Position</font><font face="宋體" lang="ZH-CN">,</font><font
face="Arial">FStream.Position + FBufPos)</font><font face="宋體" lang="ZH-CN">,就將緩沖區(qū)中的內(nèi)容寫入流,重新設(shè)置緩沖區(qū)在流中的相對(duì)位置;否則,就只是移動(dòng)</font><font
face="Arial">FBufPos</font><font face="宋體" lang="ZH-CN">指針。</p>
<p> </font><font face="Arial">2. TWriter</font><font face="宋體" lang="ZH-CN">方法的實(shí)現(xiàn)</p>
<p> ⑴</font><font face="Arial"> WriteListBegin</font><font face="宋體"
lang="ZH-CN">和</font><font face="Arial">WriteListEnd</font><font face="宋體"
lang="ZH-CN">的實(shí)現(xiàn)</p>
<p> 這兩個(gè)方法都是用于寫連續(xù)若干個(gè)相同類型的值。</font><font
face="Arial">WriteListBegin</font><font face="宋體" lang="ZH-CN">寫入</font><font
face="Arial">VaList</font><font face="宋體" lang="ZH-CN">標(biāo)志,</font><font
face="Arial">WriteListEnd</font><font face="宋體" lang="ZH-CN">寫入</font><font
face="Arial">VaNull</font><font face="宋體" lang="ZH-CN">標(biāo)志。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteListBegin;</p>
<p>begin</p>
<p>WriteValue(vaList);</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>procedure TWriter.WriteListEnd;</p>
<p>begin</p>
<p>WriteValue(vaNull);</p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> 這兩個(gè)方法都調(diào)用</font><font face="Arial">TWriter</font><font
face="宋體" lang="ZH-CN">對(duì)象的</font><font face="Arial">WriteValue</font><font
face="宋體" lang="ZH-CN">方法,該方法主要用于寫入</font><font face="Arial">TValueType</font><font
face="宋體" lang="ZH-CN">類型的值。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteValue(Value: TValueType);</p>
<p>begin</p>
<p>Write(Value, SizeOf(Value)); </p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> ⑵</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">簡(jiǎn)單數(shù)據(jù)類型的寫入</p>
<p> 簡(jiǎn)單數(shù)據(jù)類型指的是整型、字符型、字符串型、浮點(diǎn)型、布爾型等。</font><font
face="Arial">TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象都定義了相應(yīng)的寫入方法。</p>
<p> </font><font face="Arial">WriteInteger</font><font face="宋體" lang="ZH-CN">方法用于寫入整型數(shù)據(jù)。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteInteger(Value: Longint);</p>
<p>begin</p>
<p>if (Value >= -128) and (Value <= 127) then</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">begin</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">WriteValue(vaInt8);</p>
<p>Write(Value, SizeOf(Shortint));</p>
<p>end else</p>
<p>if (Value >= -32768) and (Value <= 32767) then</p>
<p>begin</p>
<p>WriteValue(vaInt16);</p>
<p>Write(Value, SizeOf(Smallint));</p>
<p>end else</p>
<p>begin</p>
<p>WriteValue(vaInt32);</p>
<p>Write(Value, SizeOf(Longint));</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">WriteInteger</font><font face="宋體" lang="ZH-CN">方法將整型數(shù)據(jù)分為</font><font
face="Arial">8</font><font face="宋體" lang="ZH-CN">位、</font><font face="Arial">16</font><font
face="宋體" lang="ZH-CN">位和</font><font face="Arial">32</font><font face="宋體"
lang="ZH-CN">位三種,并分別用</font><font face="Arial">vaInt8</font><font
face="宋體" lang="ZH-CN">、</font><font face="Arial">vaInt16</font><font face="宋體"
lang="ZH-CN">和</font><font face="Arial">VaInt32</font><font face="宋體" lang="ZH-CN">。</p>
<p> </font><font face="Arial">WriteBoolean</font><font face="宋體" lang="ZH-CN">用于寫入布爾型數(shù)據(jù):</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteBoolean(Value: Boolean);</p>
<p>begin</p>
<p>if Value then</p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -