?? 051.htm
字號:
face="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">覆蓋了構造函數</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">,該函數帶有</font><fontface="Arial">Handle </font><font face="宋體" lang="ZH-CN">參數,該參數指定與</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">對象相關的文件句柄。</p><p> </font><font face="Arial"></p><p>20.1.2.1 THandleStream</font><font face="宋體" lang="ZH-CN">的屬性的方法:</p><p> </p><p> </font><font face="Arial">1. Handle</font><font face="宋體" lang="ZH-CN">屬性</p><p> 聲明:</font><font face="Arial">property Handle: Integer; </p><p>Handle</font><font face="宋體" lang="ZH-CN">屬性提供了對文件句柄的只讀訪問,該句柄由</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">的構造方法</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">傳入。因此除了用</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">提供的方法外,也可以用文件管理函數對句柄進行操作。實際上,</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">的方法在實現上也是運用文件管理函數進行實際的讀寫操作。</p><p> </font><font face="Arial">2. Create</font><font face="宋體" lang="ZH-CN">方法</p><p> 聲明:</font><font face="Arial">constructor Create(AHandle: Integer); </font><fontface="宋體" lang="ZH-CN"></p><p> </font><font face="Arial">Create</font><font face="宋體" lang="ZH-CN">方法使用傳入的</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">參數創建一個與特定文件句柄相聯的</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">對象,并且將</font><fontface="Arial">AHandle</font><font face="宋體" lang="ZH-CN">賦給流的</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">屬性。</p><p> </p><p> </font><font face="Arial">3. Read</font><font face="宋體" lang="ZH-CN">、</font><fontface="Arial">Write</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Seek</font><fontface="宋體" lang="ZH-CN">方法</p><p> 這三個方法是</font><font face="Arial">TStream</font><font face="宋體"lang="ZH-CN">的虛方法,只是在</font><font face="Arial">THandleStream </font><fontface="宋體" lang="ZH-CN">中覆蓋了這三個方法,以實現特定媒介──文件的數據存取。后面會詳細介紹這三個方法的實現。</p><p> </font><font face="Arial"></p><p>20.1.2.2 THandleStream</font><font face="宋體" lang="ZH-CN">的實現原理</p><p> </p><p> </font><font face="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">是從</font><fontface="Arial">TStream</font><font face="宋體" lang="ZH-CN">繼承來的,因此可以共用</font><fontface="Arial">TStream</font><font face="宋體" lang="ZH-CN">中的屬性和大多數方法。</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">在實現上主要是增加了一個屬性</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">和覆蓋了</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">、</font><font face="Arial">Read</font><fontface="宋體" lang="ZH-CN">、</font><font face="Arial">Write</font><font face="宋體"lang="ZH-CN">和</font><font face="Arial">Seek</font><font face="宋體" lang="ZH-CN">四個方法。</p><p> </font><font face="Arial">1. </font><font face="宋體" lang="ZH-CN">屬性的實現</p><p> </font><font face="Arial">Handle</font><font face="宋體" lang="ZH-CN">屬性的實現正如</font><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">大多數屬性的實現那樣,先在對象定義的</font><fontface="Arial">private</font><font face="宋體" lang="ZH-CN">部分聲明一個存放數據的變量</font><fontface="Arial">FHandle</font><font face="宋體" lang="ZH-CN">,然后在定義的</font><fontface="Arial">public</font><font face="宋體" lang="ZH-CN">部分聲明屬性</font><fontface="Arial">Handle</font><font face="宋體" lang="ZH-CN">,其中屬性定義的讀寫控制部分加上只讀控制,讀控制只是直接讀取</font><fontface="Arial">FHandle</font><font face="宋體" lang="ZH-CN">變量的值,其實現如下:</p><p> </font><font face="Arial"></p><p>THandleStream = class(TStream)</p><p>private</p><p>FHandle: Integer;</p><p>public</p><p></font><font face="宋體" lang="ZH-CN">…</font><font face="Arial"></p><p>property Handle: Integer read FHandle;</p><p>end;</p><p></font> <font face="Arial"></p><p>2. </font><font face="宋體" lang="ZH-CN">方法的實現</p><p> </font><font face="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">的</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">方法,以</font><fontface="Arial">AHandle</font><font face="宋體" lang="ZH-CN">作為參數,在方法里面只是簡單的將</font><fontface="Arial">AHandle</font><font face="宋體" lang="ZH-CN">的值賦給</font><fontface="Arial">FHandle</font><font face="宋體" lang="ZH-CN">,其實現如下:</p><p> </font><font face="Arial"></p><p>constructor THandleStream.Create(AHandle: Integer);</p><p>begin</p><p>FHandle := AHandle;</p><p>end;</p><p></font> <font face="宋體" lang="ZH-CN"></p><p> 為實現針對文件的數據對象存儲,</font><font face="Arial">THandleStream</font><fontface="宋體" 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><fontface="Arial">Seek</font><font face="宋體" lang="ZH-CN">方法覆蓋了</font><fontface="Arial">TStream</font><font face="宋體" lang="ZH-CN">中的相應方法。它們的實現都調用了</font><fontface="Arial">Windows</font><font face="宋體" lang="ZH-CN">的文件管理函數。</p><p> </font><font face="Arial">Read</font><font face="宋體" lang="ZH-CN">方法調用</font><fontface="Arial">FileRead</font><font face="宋體" lang="ZH-CN">函數實現文件讀操作,其實現如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Read(var Buffer; Count: Longint): Longint;</p><p>begin</p><p>Result := FileRead(FHandle, Buffer, Count);</p><p>if Result = -1 then Result := 0;</p><p>end;</p><p></font> <font face="宋體" lang="ZH-CN"></p><p> </font><font face="Arial">Write</font><font face="宋體" lang="ZH-CN">方法調用</font><fontface="Arial">FileWrite</font><font face="宋體" lang="ZH-CN">函數實現文件寫操作,其實現如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Write(const Buffer; Count: Longint): Longint;</p><p>begin</p><p>Result := FileWrite(FHandle, Buffer, Count);</p><p>if Result = -1 then Result := 0;</p><p>end;</p><p></font> <font face="宋體" lang="ZH-CN"></p><p> </font><font face="Arial">Seek</font><font face="宋體" lang="ZH-CN">方法調用</font><fontface="Arial">FileSeek</font><font face="宋體" lang="ZH-CN">函數實現文件指針的移動,其實現如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Seek(Offset: Longint; Origin: Word): Longint;</p><p>begin</p><p>Result := FileSeek(FHandle, Offset, Origin);</p><p>end;</p><p></font> <font face="Arial"></p><p>20.1.3 TFileStream</font><font face="宋體" lang="ZH-CN">對象</p><p> </p><p> </font><font face="Arial">TFileStream</font><font face="宋體" lang="ZH-CN">對象是在磁盤文件上存儲數據的</font><fontface="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象。</font><fontface="Arial">TFileStream</font><font face="宋體" lang="ZH-CN">是從</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">繼承下來的,它和</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">一樣都是實現文件的存取操作。不同之處在于</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">用句柄訪問文件,而</font><fontface="Arial">TFileStream</font><font face="宋體" lang="ZH-CN">用文件名訪問文件。實際上</font><fontface="Arial">TFileStream</font><font face="宋體" lang="ZH-CN">是</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">上的一層包裝,其內核是</font><fontface="Arial">THandleStream</font><font face="宋體" lang="ZH-CN">的屬性和方法。</p><p> </font><font face="Arial">TFileStream</font><font face="宋體" lang="ZH-CN">中沒有增加新的屬性和方法。它只是覆蓋了的構造方法</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">和析構方法</font><fontface="Arial">Destory</font><font face="宋體" lang="ZH-CN">。在</font><fontface="Arial">Create</font><font face="宋體" lang="ZH-CN">方法中帶兩個參數</font><fontface="Arial">FileName</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Mode</font><fontface="宋體" lang="ZH-CN">。</font><font face="Arial">FileName</font><font face="宋體"lang="ZH-CN">描述要創建或打開的文件名,而</font><font face="Arial">Mode</font><fontface="宋體" lang="ZH-CN">描述文件模式如</font><font face="Arial">fmCreate</font><fontface="宋體" lang="ZH-CN">、</font><font face="Arial">fmOpenRead</font><fontface="宋體" lang="ZH-CN">和</font><font face="Arial">fmOpenWrite</font><fontface="宋體" lang="ZH-CN">等。</font><font face="Arial">Create</font><fontface="宋體" lang="ZH-CN">方法首先使用</font><font face="Arial">FileCreate</font><fontface="宋體" lang="ZH-CN">或</font><font face="Arial">FileOpen</font><font face="宋體"lang="ZH-CN">函數創建或打開名為</font><font face="Arial">FileName</font><fontface="宋體" lang="ZH-CN">的文件,再將得到的文件句柄賦給</font><fontface="Arial">FHandle</font><font face="宋體" lang="ZH-CN">。</font><font face="Arial">TFileStream</font><fontface="宋體" lang="ZH-CN">的文件讀寫操作都是由從</font><font face="Arial">THandleStream</font><fontface="宋體" lang="ZH-CN">繼承的</font><font face="Arial">Read</font><FONT< P> </p><p>var</p><p>Stream: TStream;</p><p>begin</p><p>Stream := TFileStream.Create(FileName, fmCreate);</p><p>try</p><p>SaveToStream(Stream);</p><p>finally</p><p>Stream.Free;</p><p>end;</p><p>end;</p><p> <font face="宋體" lang="ZH-CN"></p><p> 在</font><font face="Arial">Delphi </font><font face="宋體" lang="ZH-CN">的許多對象的</font><fontface="Arial">SaveToStream </font><font face="宋體" lang="ZH-CN">和</font><fontface="Arial">SaveToFile</font><font face="宋體" lang="ZH-CN">、</font><fontface="Arial">LoadFromStream</font><font face="宋體" lang="ZH-CN">和</font><fontface="Arial">LoadFromFile</font><font face="宋體" lang="ZH-CN">方法的實現都有類似的嵌套結構。</p><p> </font><font face="Arial"></p><p>20.1.5 TMemoryStream</font><font face="宋體" lang="ZH-CN">對象</p><p> </p><p> </font> <font face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">對象是一個管理動態內存中的數據的</font><fontface="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象,它是從</font><fontface="Arial">TCustomMemoryStream</font><font face="宋體" lang="ZH-CN">中繼承下來的,除了從</font><fontface="Arial">TCustomMemoryStream</font><font face="宋體" lang="ZH-CN">中繼承的屬性和方法外,它還增加和覆蓋了一些用于從磁盤文件和其它注臺讀數據的方法。它還提供了寫入、消除內存內容的動態內存管理方法。下面介紹它的這些屬性和方法。</p><p> </font><font face="Arial"></p><p>20.1.5.1 TMemoryStream</font><font face="宋體" lang="ZH-CN">的屬性和方法</p><p> </p><p> </font><font face="Arial">1. Capacity</font><font face="宋體" lang="ZH-CN">屬性</p><p> 聲明:</font><font face="Arial">property Copacity: Longint; </p><p>Capacity</font><font face="宋體" lang="ZH-CN">屬性決定了分配給內存流的內存池的大小。這與</font><fontface="Arial">Size</font><font face="宋體" lang="ZH-CN">屬性有些不同。</font><fontface="Arial">Size</font><font face="宋體" lang="ZH-CN">屬性是描述流中數據的大小。在程序中可以將</font><fontface="Arial">Capacity </font><font face="宋體" lang="ZH-CN">的值設置的比數據所需最大內存大一些,這樣可以避免頻繁地重新分配。</p><p> </font><font face="Arial">2. Realloc</font><font face="宋體" lang="ZH-CN">方法</p><p> 聲明:</font><font face="Arial">function Realloc(var NewCapacity: Longint):Pointer; virtual; </p><p>Realloc</font><font face="宋體" lang="ZH-CN">方法,以</font><font face="Arial">8K</font><fontface="宋體" lang="ZH-CN">為單位分配動態內存,內存的大小由</font><fontface="Arial">NewCapacity</font><font face="宋體" lang="ZH-CN">指定,函數返回指向所分配內存的指針。</p><p> </font><font face="Arial">3. SetSize</font><font face="宋體" lang="ZH-CN">方法</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -