?? 051.htm
字號(hào):
face="Arial">SetPosition</font><font face="宋體" lang="ZH-CN">。兩個(gè)方法的聲明如下:</p><p> </font><font face="Arial"></p><p>function TStream.GetPosition: Longint;</p><p>begin</p><p>Result := Seek(0, 1);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.SetPosition(Pos: Longint);</p><p>begin</p><p>Seek(Pos, 0);</p><p>end;</p><p></font> <font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN">在設(shè)置位置時(shí),</font><font face="Arial">Delphi</font><fontface="宋體" lang="ZH-CN">編譯機(jī)制會(huì)自動(dòng)將</font><font face="Arial">Position</font><fontface="宋體" lang="ZH-CN">傳為</font><font face="Arial">Pos</font><font face="宋體"lang="ZH-CN">。</p><p> 前面介紹過</font><font face="Arial">Seek</font><font face="宋體"lang="ZH-CN">的使用方法,第一參數(shù)是移動(dòng)偏移量,第二個(gè)參數(shù)是移動(dòng)的起點(diǎn),返回值是移動(dòng)后的指針位置。</p><p> </font><font face="Arial">Size</font><font face="宋體" lang="ZH-CN">屬性的實(shí)現(xiàn)只有讀控制,完全屏蔽了寫操作。讀控制方法</font><fontface="Arial">GetSize</font><font face="宋體" lang="ZH-CN">實(shí)現(xiàn)如下:</p><p> </font><font face="Arial"></p><p>function TStream.GetSize: Longint;</p><p>var</p><p>Pos: Longint;</p><p>begin</p><p>Pos := Seek(0, 1);</p><p>Result := Seek(0, 2);</p><p>Seek(Pos, 0);</p><p>end;</p><p></font> <font face="Arial"></p><p>2. TStream</font><font face="宋體" lang="ZH-CN">方法的實(shí)現(xiàn)</p><p> ⑴</font><font face="Arial"> CopyFrom</font><font face="宋體" lang="ZH-CN">方法</p><p> </font><font face="Arial">CopyFrom</font><font face="宋體" lang="ZH-CN">是</font><fontface="Arial">Stream</font><font face="宋體" lang="ZH-CN">對(duì)象中很有用的方法,它用于在不同存儲(chǔ)媒介中拷貝數(shù)據(jù)。例如,內(nèi)存與外部文件之間、內(nèi)存與數(shù)據(jù)庫字段之間等。它簡(jiǎn)化了許多內(nèi)存分配、文件打開和讀寫等的細(xì)節(jié),將所有拷貝操作都統(tǒng)一到</font><fontface="Arial">Stream</font><font face="宋體" lang="ZH-CN">對(duì)象上。</p><p> 前面曾介紹:</font><font face="Arial">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">兩個(gè)參數(shù)并返回長整型。該方法將</font><fontface="Arial">Count</font><font face="宋體" lang="ZH-CN">個(gè)字節(jié)的內(nèi)容從</font><fontface="Arial">Source</font><font face="宋體" lang="ZH-CN">拷貝到當(dāng)前流中,如果</font><fontface="Arial">Count</font><font face="宋體" lang="ZH-CN">值為</font><font face="Arial">0</font><fontface="宋體" lang="ZH-CN">則拷貝所有數(shù)據(jù)。</p><p> </font><font face="Arial"></p><p>function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;</p><p>const</p><p>MaxBufSize = $F000;</p><p>var</p><p>BufSize, N: Integer;</p><p>Buffer: PChar;</p><p>begin</p><p>if Count = 0 then</p><p>begin</p><p>Source.Position := 0;</p><p>CouNG="ZH-CN"></font>資源文件中的部件時(shí)調(diào)用,通常程序員不需自己調(diào)用。如果讀取的不是資源文件<fontface="Arial">ReadResHeader</font><font face="宋體" lang="ZH-CN">,將觸發(fā)異常事件。</p><p> </font><font face="Arial"></p><p>procedure TStream.ReadResHeader;</p><p>var</p><p>ReadCount: Longint;</p><p>Header: array[0..79] of Char;</p><p>begin</p><p>FillChar(Header, SizeOf(Header), 0);</p><p>ReadCount := Read(Header, SizeOf(Header) - 1);</p><p>if (Byte((@Header[0])^) = $FF) and (Word((@Header[1])^) = 10) then</p><p>Seek(StrLen(Header + 3) + 10 - ReadCount, 1)</p><p>else</p><p>raise EInvalidImage.CreateRes(SInvalidImage);</p><p>end;</p><p></font> <font face="宋體" lang="ZH-CN"></p><p> </font><font face="Arial">ReadComponentRes</font><font face="宋體" lang="ZH-CN">在</font><fontface="Arial">Windows</font><font face="宋體" lang="ZH-CN">資源文件中讀取部件,為了判斷是否是資源文件,它首先調(diào)用</font><fontface="Arial">ReadResHeader</font><font face="宋體" lang="ZH-CN">方法,然后調(diào)用</font><fontface="Arial">ReadComponent</font><font face="宋體" lang="ZH-CN">方法讀取</font><fontface="Arial">Instance</font><font face="宋體" lang="ZH-CN">指定的部件。下面是它的實(shí)現(xiàn):</p><p> </font><font face="Arial"></p><p>function TStream.ReadComponentRes(Instance: TComponent): TComponent;</p><p>begin</p><p>ReadResHeader;</p><p>Result := ReadComponent(Instance);</p><p>end;</p><p></font> <font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> 與</font><font face="Arial">ReadComponentRes</font><fontface="宋體" lang="ZH-CN">相應(yīng)的寫方法是</font><font face="Arial">WriteComponentRes</font><fontface="宋體" lang="ZH-CN">,</font><font face="Arial">Delphi </font><font face="宋體"lang="ZH-CN">調(diào)用這兩個(gè)方法讀寫窗體文件</font><font face="Arial">(DFM</font><fontface="宋體" lang="ZH-CN">文件</font><font face="Arial">)</font><font face="宋體"lang="ZH-CN">,在后面書中會(huì)舉用這兩個(gè)方法讀取</font><font face="Arial">DFM</font><fontface="宋體" lang="ZH-CN">文件的例子。</p><p> ⑷</font><font face="Arial"> WriteComponent</font><font face="宋體"lang="ZH-CN">和</font><font face="Arial">WriteDescendant</font><font face="宋體"lang="ZH-CN">方法</p><p> </font><font face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對(duì)象的</font><fontface="Arial">WriteDescendant</font><font face="宋體" lang="ZH-CN">方法在實(shí)現(xiàn)過程中,創(chuàng)建了</font><fontface="Arial">TWriter</font><font face="宋體" lang="ZH-CN">對(duì)象,然后利用</font><fontface="Arial">TWriter</font><font face="宋體" lang="ZH-CN">的</font><font face="Arial">WriteDescendant</font><fontface="宋體" lang="ZH-CN">方法將</font><font face="Arial">Instance</font><fontface="宋體" lang="ZH-CN">寫入流。而</font><font face="Arial">WriteComponent</font><fontface="宋體" lang="ZH-CN">方法只是簡(jiǎn)單地調(diào)用</font><font face="Arial">WriteDescendant</font><fontface="宋體" lang="ZH-CN">方法將</font><font face="Arial">Instance</font><fontface="宋體" lang="ZH-CN">寫入流。它們的實(shí)現(xiàn)如下:</p><p> </font><font face="Arial"></p><p>procedure TStream.WriteComponent(Instance: TComponent);</p><p>begin</p><p>WriteDescendent(Instance, nil);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.WriteDescendent(Instance, Ancestor: TComponent);</p><p>var</p><p>Writer: TWriter;</p><p>begin</p><p>Writer := TWriter.Create(Self, 4096);</p><p>try</p><p>Writer.WriteDescendent(Instance, Ancestor);</p><p>finally</p><p>Writer.Free;</p><p>end;</p><p>end;</p><p></font> <font face="宋體" lang="ZH-CN"></p><p> ⑸</font><font face="Arial"> WriteDescendantRes</font><font face="宋體"lang="ZH-CN">和</font><font face="Arial">WriteComponentRes</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><fontface="宋體" lang="ZH-CN">資源文件;而</font><font face="Arial">WriteComponentRes </font><fontface="宋體" lang="ZH-CN">方法只是簡(jiǎn)單地調(diào)用</font><font face="Arial">WriteDescendantRes</font><fontface="宋體" lang="ZH-CN">方法,它們的實(shí)現(xiàn)如下:</p><p> </font><font face="Arial"></p><p>procedure TStream.WriteComponentRes(const ResName: string; Instance: </p><p>TComponent);</p><p>begin</p><p>WriteDescendentRes(ResName, Instance, nil);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.WriteDescendentRes(const ResName: string; Instance,</p><p>Ancestor: TComponent);</p><p>var</p><p>HeaderSize: Integer;</p><p>Origin, ImageSize: Longint;</p><p>Header: array[0..79] of Char;</p><p>begin</p><p>Byte((@Header[0])^) := $FF;</p><p>Word((@Header[1])^) := 10;</p><p>HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[3], ResName, 63))) + 10;</p><p>Word((@Header[HeaderSize - 6])^) := $1030;</p><p>Longint((@Header[HeaderSize - 4])^) := 0;</p><p>WriteBuffer(Header, HeaderSize);</p><p>Origin := Position;</p><p>WriteDescendent(Instance, Ancestor);</p><p>ImageSize := Position - Origin;</p><p>Position := Origin - 4;</p><p>WriteBuffer(ImageSize, SizeOf(Longint));</font><font face="宋體" lang="ZH-CN"></p><p></font><font face="Arial">Position := Origin + ImageSize;</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">WriteCompnentRes</font><font face="宋體" lang="ZH-CN">是與</font><fontface="Arial">ReadComponentRes</font><font face="宋體" lang="ZH-CN">相應(yīng)的對(duì)象寫方法,這兩個(gè)方法相互配合可讀取</font><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">的</font><font face="Arial">DFM</font><fontface="宋體" lang="ZH-CN">文件,從而利用</font><font face="Arial">Delphi</font><fontface="宋體" lang="ZH-CN">系統(tǒng)的功能。</p><p> </font><font face="Arial"></p><p>20.1.2 THandleStream</font><font face="宋體" lang="ZH-CN">對(duì)象</p><p> </p><p> </font><font face="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">對(duì)象的行為特別象</font><fontface="Arial">FileStream</font><font face="宋體" lang="ZH-CN">對(duì)象,所不同的是它通過已創(chuàng)建的文件句柄而不是文件名來存儲(chǔ)流中的數(shù)據(jù)。</p><p> </font><font face="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">對(duì)象定義了</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">屬性,該屬性提供了對(duì)文件句柄的只讀訪問,并且</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">屬性可以作為</font><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">的</font><font face="Arial">RTL</font><fontface="宋體" lang="ZH-CN">文件管理函數(shù)的參數(shù),利用文件類函數(shù)來讀寫數(shù)據(jù)。</font><font
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -