?? 051.htm
字號(hào):
<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">屬性決定了分配給內(nèi)存流的內(nèi)存池的大小。這與</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">屬性有些不同。</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">屬性是描述流中數(shù)據(jù)的大小。在程序中可以將</font><font
face="Arial">Capacity </font><font face="宋體" lang="ZH-CN">的值設(shè)置的比數(shù)據(jù)所需最大內(nèi)存大一些,這樣可以避免頻繁地重新分配。</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><font
face="宋體" lang="ZH-CN">為單位分配動(dòng)態(tài)內(nèi)存,內(nèi)存的大小由</font><font
face="Arial">NewCapacity</font><font face="宋體" lang="ZH-CN">指定,函數(shù)返回指向所分配內(nèi)存的指針。</p>
<p> </font><font face="Arial">3. SetSize</font><font face="宋體" lang="ZH-CN">方法</p>
<p> </font><font face="Arial">SetSize</font><font face="宋體" lang="ZH-CN">方法消除內(nèi)存流中包含的數(shù)據(jù),并將內(nèi)存流中內(nèi)存池的大小設(shè)為</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">字節(jié)。如果</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">為零,是</font><font
face="Arial">SetSize</font><font face="宋體" lang="ZH-CN">方法將釋放已有的內(nèi)存池,并將</font><font
face="Arial">Memory</font><font face="宋體" lang="ZH-CN">屬性置為</font><font
face="Arial">nil</font><font face="宋體" lang="ZH-CN">;否則,</font><font
face="Arial">SetSize</font><font face="宋體" lang="ZH-CN">方法將內(nèi)存池大小調(diào)整為</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">。</font><font face="Arial"></p>
<p>4. Clear</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure Clear; </p>
<p>Clear</font><font face="宋體" lang="ZH-CN">方法釋放內(nèi)存中的內(nèi)存池,并將</font><font
face="Arial">Memory</font><font face="宋體" lang="ZH-CN">屬性置為</font><font
face="Arial">nil</font><font face="宋體" lang="ZH-CN">。在調(diào)用</font><font
face="Arial">Clear</font><font face="宋體" lang="ZH-CN">方法后,</font><font
face="Arial">Size</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Position</font><font
face="宋體" lang="ZH-CN">屬性都為</font><font face="Arial">0</font><font
face="宋體" lang="ZH-CN">。</p>
<p> </font><font face="Arial">5. LoadFromStream</font><font face="宋體"
lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure LoadFromStream(Stream: TStream); </p>
<p>LoadFromStream</font><font face="宋體" lang="ZH-CN">方法將</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">指定的流中的全部?jī)?nèi)容復(fù)制到</font><font
face="Arial">MemoryStream</font><font face="宋體" lang="ZH-CN">中,復(fù)制過(guò)程將取代已有內(nèi)容,使</font><font
face="Arial">MemoryStream</font><font face="宋體" lang="ZH-CN">成為</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">的一份拷貝。</p>
<p> </font><font face="Arial">6. LoadFromFile</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">procedure LoadFromFile(count FileName:
String); </p>
<p>LoadFromFile</font><font face="宋體" lang="ZH-CN">方法將</font><font face="Arial">FileName</font><font
face="宋體" lang="ZH-CN">指定文件的所有內(nèi)容復(fù)制到</font><font face="Arial">MemoryStream</font><font
face="宋體" lang="ZH-CN">中,并取代已有內(nèi)容。調(diào)用</font><font face="Arial">LoadFromFile</font><font
face="宋體" lang="ZH-CN">方法后,</font><font face="Arial">MemoryStream</font><font
face="宋體" lang="ZH-CN">將成為文件內(nèi)容在內(nèi)存中的完整拷貝。</p>
<p> </font><font face="Arial"></p>
<p>20.1.5.2 TMemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象的實(shí)現(xiàn)原理</p>
<p> </p>
<p> </font><font face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">從</font><font
face="Arial">TCustomMemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象直接繼承,因此可以享用</font><font
face="Arial">TCustomMemoryStream</font><font face="宋體" lang="ZH-CN">的屬性和方法。前面講過(guò),</font><font
face="Arial">TCustomMemoryStream</font><font face="宋體" lang="ZH-CN">是用于內(nèi)存中數(shù)據(jù)操作的抽象對(duì)象,它為</font><font
face="Arial">MemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象的實(shí)現(xiàn)提供了框架,框架中的內(nèi)容還要由具體</font><font
face="Arial">MemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象去填充。</font><font
face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象就是按動(dòng)態(tài)內(nèi)存管理的需要填充框架中的具體內(nèi)容。下面介紹</font><font
face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象的實(shí)現(xiàn)。</p>
<p> </font><font face="Arial">1. TMemoryStream</font><font face="宋體" lang="ZH-CN">屬性的實(shí)現(xiàn)</p>
<p> </font><font face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">在其</font><font
face="Arial">protected</font><font face="宋體" lang="ZH-CN">部分增加了一個(gè)</font><font
face="Arial">Capacity</font><font face="宋體" lang="ZH-CN">屬性,該屬性決定了</font><font
face="Arial">MemoryStream</font><font face="宋體" lang="ZH-CN">所占動(dòng)態(tài)內(nèi)存的大小。</font><font
face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">首先在</font><font
face="Arial">private</font><font face="宋體" lang="ZH-CN">部分聲明了</font><font
face="Arial">FCapacity</font><font face="宋體" lang="ZH-CN">變量作為存儲(chǔ)</font><font
face="Arial">Capacity</font><font face="宋體" lang="ZH-CN">屬性值的數(shù)據(jù)域,然后在</font><font
face="Arial">protected</font><font face="宋體" lang="ZH-CN">部分聲明了該屬性。在屬性聲明的讀控制部分簡(jiǎn)單讀取</font><font
face="Arial">FCapacity</font><font face="宋體" lang="ZH-CN">的值,在寫控制處調(diào)用了方法</font><font
face="Arial">SetCapacity</font><font face="宋體" lang="ZH-CN">。該方法除了給</font><font
face="Arial">FCapacity</font><font face="宋體" lang="ZH-CN">賦值外還執(zhí)行了修改</font><font
face="Arial">Capacity</font><font face="宋體" lang="ZH-CN">屬性所必需操作如狀態(tài)改變等。</p>
<p> 下面是屬性的實(shí)現(xiàn):</p>
<p> </p>
<p></font><font face="Arial">TMemoryStream = class(TCustomMemoryStream)</p>
<p>private</p>
<p>FCapacity: Longint;</p>
<p>procedure SetCapacity(NewCapacity: Longint);</p>
<p>protected</p>
<p></font><font face="宋體" lang="ZH-CN">…</p>
<p></font><font face="Arial">property Capacity: Longint read FCapacity write SetCapacity;</p>
<p>public</p>
<p></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">SetCapacity</font><font face="宋體"
lang="ZH-CN">的實(shí)現(xiàn)是這樣的:</p>
<p> </p>
<p></font><font face="Arial">procedure TMemoryStream.SetCapacity(NewCapacity: Longint);</p>
<p>begin</p>
<p>SetPointer(Realloc(NewCapacity), FSize);</p>
<p>FCapacity := NewCapacity;</p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> 在</font><font face="Arial">SetCapacity </font><font face="宋體" lang="ZH-CN">方法先是調(diào)用</font><font
face="Arial">Realloc</font><font face="宋體" lang="ZH-CN">重新分配內(nèi)存,然后用</font><font
face="Arial">NewCapacity</font><font face="宋體" lang="ZH-CN">的值給</font><font
face="Arial">FCapacity</font><font face="宋體" lang="ZH-CN">賦值。</font><font
face="Arial">Realloc</font><font face="宋體" lang="ZH-CN">方法進(jìn)行某些對(duì)象狀態(tài)的改變。</p>
<p> </font><font face="Arial">2. TMemoryStream</font><font face="宋體" lang="ZH-CN">對(duì)象方法的實(shí)現(xiàn)</p>
<p> ⑴</font><font face="Arial"> Realloc</font><font face="宋體" lang="ZH-CN">方法</p>
<p> </font><font face="Arial">Realloc</font><font face="宋體" lang="ZH-CN">方法是</font><font
face="Arial">TMemoryStream</font><font face="宋體" lang="ZH-CN">動(dòng)態(tài)內(nèi)存分配的核心,它的</font><font
face="Arial">SetSize</font><font face="宋體" lang="ZH-CN">、</font><font face="Arial">SetCapacity</font><font
face="宋體" lang="ZH-CN">等方法最終都是調(diào)用</font><font face="Arial">Realloc</font><font
face="宋體" lang="ZH-CN">進(jìn)行內(nèi)存的分配和初始化工作的。它的實(shí)現(xiàn)如下:</p>
<p> </p>
<p></font><font face="Arial">const</p>
<p>MemoryDelta = $2000; </p>
<p></font> <font face="Arial"></p>
<p>function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;</p>
<p>begin</p>
<p>if NewCapacity > 0 then</p>
<p>NewCapacity := (NewCapacity + (MemoryDelta - 1)) and not (MemoryDelta - 1);</p>
<p>Result := Memory;</p>
<p>if NewCapacity <> FCapacity then</p>
<p>begin</font><font face="宋體" lang="ZH-CN"></p>
<p></font><font face="Arial">if NewCapacity = 0 then</font><font face="宋體"
lang="ZH-CN"></p>
<p></font><font face="Arial">begin</p>
<p>GlobalFreePtr(Memory);</p>
<p>Result := nil;</p>
<p>end else</p>
<p>begin</p>
<p>if Capacity = 0 then</p>
<p>Result := GlobalAllocPtr(HeapAllocFlags, NewCapacity)</p>
<p>else</p>
<p>Result := GlobalReallocPtr(Memory, NewCapacity, HeapAllocFlags);</p>
<p>if Result = nil then raise EStreamError.CreateRes(SMemoryStreamError);</p>
<p>end;</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Realloc</font><font face="宋體" lang="ZH-CN">方法是以</font><font
face="Arial">8K</font><font face="宋體" lang="ZH-CN">為單位分配動(dòng)態(tài)內(nèi)存的,方法中的第一句</font><font
face="Arial">if</font><font face="宋體" lang="ZH-CN">語(yǔ)句就是執(zhí)行該操作。如果傳入的</font><font
face="Arial">NewCapacity</font><font face="宋體" lang="ZH-CN">參數(shù)值為</font><font
face="Arial">0</font><font face="宋體" lang="ZH-CN">,則釋放流中的內(nèi)存。</font><font
face="Arial">Realloc</font><font face="宋體" lang="ZH-CN">方法用</font><font
face="Arial">GLobal FreePtr</font><font face="宋體" lang="ZH-CN">函數(shù)釋放內(nèi)存,用</font><font
face="Arial">GlobalAllocPtr</font><font face="宋體" lang="ZH-CN">分配內(nèi)存,用</font><font
face="Arial">GlobalReallocPtr</font><font face="宋體" lang="ZH-CN">進(jìn)行內(nèi)存的重分配。如果原來(lái)的</font><font
face="Arial">Capacity</font><font face="宋體" lang="ZH-CN">屬性值為</font><font
face="Arial">0</font><font face="宋體" lang="ZH-CN">,則調(diào)用</font><font
face="Arial">Globa|AllocPtr</font><font face="宋體" lang="ZH-CN">否則調(diào)用</font><font
face="Arial">GlobalReallocPtr</font><font face="宋體" lang="ZH-CN">。最后如果</font><font
face="Arial">Result</font><font face="宋體" lang="ZH-CN">為</font><font face="Arial">nil</font><font
face="宋體" lang="ZH-CN">則觸發(fā)內(nèi)存流錯(cuò)的異常事件,否則返回指向分配的內(nèi)存的指針。</p>
<p> ?、?lt;/font><font face="Arial"> Write</font><font face="宋體" lang="ZH-CN">方法</p>
<p> </font><font face="Arial">Write</font><font face="宋體" lang="ZH-CN">方法從內(nèi)存流內(nèi)部緩沖池的當(dāng)前位置開(kāi)始寫入二進(jìn)制數(shù)據(jù)。其實(shí)現(xiàn)如下:</p>
<p> </p>
<p></font><font face="Arial">function TMemoryStream.Write(const Buffer; Count: Longint):
Longint;</p>
<p>var</p>
<p>Pos: Longint;</p>
<p>begin</p>
<p>if (FPosition >= 0) and (Count >= 0) then</p>
<p>begin</p>
<p>Pos := FPosition + Count;</p>
<p>if Pos > 0 then</p>
<p>begin</p>
<p>if Pos > FSize then</p>
<p>begin</p>
<p>if Pos > FC
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -