在线现看午夜福利片|女人16久久免费视频|鲁丝片一区鲁丝片二区鲁丝|一区二区三区欧美在线

  1. 
    
    <b id="glvx9"></b>
        1. <blockquote id="glvx9"><meter id="glvx9"></meter></blockquote>
            首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
            2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
            MPA考試 | 中科院
            四六級 | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
            新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
            計算機(jī)等級考試 | 軟件水平考試 | 職稱計算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
            華為認(rèn)證 | Java認(rèn)證
            公務(wù)員 | 報關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
            報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師
            人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
            駕駛員 | 網(wǎng)絡(luò)編輯
            衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
            會計從業(yè)資格考試會計證) | 經(jīng)濟(jì)師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務(wù)師
            注冊資產(chǎn)評估師 | 高級會計師 | ACCA | 統(tǒng)計師 | 精算師 | 理財規(guī)劃師 | 國際內(nèi)審師
            一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
            質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價師 | 土地估價師 | 巖土師
            設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項目管理師 | 土地登記代理人 | 環(huán)境影響評價師 | 環(huán)保工程師
            城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師
            繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

            2011等考Delphi:開發(fā)Delphi對象式數(shù)據(jù)管理功能

            在本章中將介紹Stream對象和Filer對象的實(shí)現(xiàn)原理、應(yīng)用方法以及在超媒體系統(tǒng)中的應(yīng)用。這對于運(yùn)用Delphi 開發(fā)高級應(yīng)用是很重要的。

              第二十章 開發(fā)Delphi對象式數(shù)據(jù)管理功能

              面向?qū)ο蠹夹g(shù)是九十年代的主流技術(shù),各類應(yīng)用軟件如果以面向?qū)ο蟮姆椒?gòu)造并且滲透面向?qū)ο蟮娘L(fēng)格將使軟件具有更高的品質(zhì)。在面向?qū)ο蟪绦蛟O(shè)計中,對象式數(shù)據(jù)管理占有很重要的地位。在Delphi中,對對象式數(shù)據(jù)管理的支持方式是其一大特色。

              Delphi是一個面向?qū)ο蟮目梢暬O(shè)計與面向?qū)ο蟮恼Z言相結(jié)合的集成開發(fā)環(huán)境。Delphi的核心是部件。部件是對象的一種。Delphi應(yīng)用程序完全是由部件來構(gòu)造的,因此開發(fā)高性能的Delphi應(yīng)用程序必然會涉及對象式數(shù)據(jù)管理技術(shù)。

              對象式數(shù)據(jù)管理包括兩方面的內(nèi)容:

              ● 用對象來管理數(shù)據(jù)

              ● 對各類數(shù)據(jù)對象(包括對象和部件)的管理

              Delphi在這兩方面都做的相當(dāng)出色。在Delphi的早期版本Turbo Pascal 中就曾有流(Stream)、群(Collection)和資源(Resource)等專門用于對象式數(shù)據(jù)管理的類。在Delphi中,這些功能得到了大大的加強(qiáng)。Delphi將對象式數(shù)據(jù)管理類歸結(jié)為Stream對象(Stream)和Filer對象(Filer),并將它們應(yīng)用于可視部件類庫(VCL)的方方面面。它們不僅提供了在內(nèi)存、外存和Windows資源中管理對象的功能,還提供了在數(shù)據(jù)庫BLOB字段中對象的功能。

              在本章中將介紹Stream對象和Filer對象的實(shí)現(xiàn)原理、應(yīng)用方法以及在超媒體系統(tǒng)中的應(yīng)用。這對于運(yùn)用Delphi 開發(fā)高級應(yīng)用是很重要的。

              20.1 流式對象的實(shí)現(xiàn)原理和應(yīng)用

              Stream對象,又稱流式對象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的統(tǒng)稱。它們分別代表了在各種媒介上存儲數(shù)據(jù)的能力,它們將各種數(shù)據(jù)類型(包括對象和部件) 在內(nèi)存、外存和數(shù)據(jù)庫字段中的管理操作抽象為對象方法,并且充分利用了面向?qū)ο蠹夹g(shù)的優(yōu)點(diǎn),應(yīng)用程序可以相當(dāng)容易地在各種Stream對象中拷貝數(shù)據(jù)。

              下面介紹各種對象的數(shù)據(jù)和方法及使用方法。

              20.1.1 TStream對象

              TStream對象是能在各種媒介中存儲二進(jìn)制數(shù)據(jù)的對象的抽象對象。從TStream 對象繼承的對象用于在內(nèi)存、Windows資源文件、磁盤文件和數(shù)據(jù)庫字段等媒介中存儲數(shù)據(jù)。

              TStream中定義了兩個屬性:Size和Position。它們分別以字節(jié)為單位表示的流的大小和當(dāng)前指針位置。TStream中定義的方法用于在各種流中讀、寫和相互拷貝二進(jìn)制數(shù)據(jù)。因為所有的Stream對象都是從TStream中繼承來的,所以在TStream中定義的域和方法都能被Stream對象調(diào)用和訪問。此外,又由于面向?qū)ο蠹夹g(shù)的動態(tài)聯(lián)編功能,TStream為各種流的應(yīng)用提供了統(tǒng)一的接口,簡化了流的使用;不同Stream對象是抽象了對不同存儲媒介的數(shù)據(jù)上的操作,因此,TStream的需方法為在不同媒介間的數(shù)據(jù)拷貝提供了最簡捷的手段。

              20.1.1.1 TStream的屬性和方法

              1. Position屬性

              聲明:property Position: Longint;

              Position屬性指明流中讀寫的當(dāng)前偏移量。

              2. Size屬性

              聲明:property Size: Longint;

              Size屬性指明了以字節(jié)為單位的流的的大小,它是只讀的。

              3. CopyFrom方法

              聲明:function CopyFrom(Source: TStream; Count: Longint): Longint;

              CopyFrom從Source所指定的流中拷貝Count個字節(jié)到當(dāng)前流中, 并將指針從當(dāng)前位置移動Count個字節(jié)數(shù),函數(shù)返回值是實(shí)際拷貝的字節(jié)數(shù)。

              4. Read方法

              聲明:function Read(var Buffer; Count: Longint): Longint; virtual; abstract;

              Read方法從當(dāng)前流中的當(dāng)前位置起將Count個字節(jié)的內(nèi)容復(fù)制到Buffer中,并把當(dāng)前指針向后移動Count個字節(jié)數(shù),函數(shù)返回值是實(shí)際讀的字節(jié)數(shù)。如果返回值小于Count,這意味著讀操作在讀滿所需字節(jié)數(shù)前指針已經(jīng)到達(dá)了流的尾部。

              Read方法是抽象方法。每個后繼Stream對象都要根據(jù)自己特有的有關(guān)特定存儲媒介的讀操作覆蓋該方法。而且流的所有其它的讀數(shù)據(jù)的方法(如:ReadBuffer,ReadComponent等)在完成實(shí)際的讀操作時都調(diào)用了Read方法。面向?qū)ο蟮膭討B(tài)聯(lián)編的優(yōu)點(diǎn)就體現(xiàn)在這兒。因為后繼Stream對象只需覆蓋Read方法,而其它讀操作(如ReadBuffer、ReadComponent等)都不需要重新定義,而且TStream還提供了統(tǒng)一的接口。

              5. ReadBuffer方法

              聲明:procedure ReadBuffer(var Buffer; Count: Longint);

              ReadBuffer方法從流中將Count個字節(jié)復(fù)制到Buffer 中, 并將流的當(dāng)前指針向后移動Count個字節(jié)。如讀操作超過流的尾部,ReadBuffer方法引起EReadError異常事件。

              6. ReadComponent方法

              聲明:function ReadComponent(Instance: TComponent): TComponent;

              ReadComponent方法從當(dāng)前流中讀取由Instance所指定的部件,函數(shù)返回所讀的部件。ReadComponent在讀Instance及其擁有的所有對象時創(chuàng)建了一個Reader對象并調(diào)用它的ReadRootComponent方法。

              如果Instance為nil,ReadComponent的方法基于流中描述的部件類型信息創(chuàng)建部件,并返回新創(chuàng)建的部件。

              7. ReadComponentRes方法

              聲明:function ReadComponentRes(Instance: TComponent): TComponent;

              ReadComponentRes方法從流中讀取Instance指定的部件,但是流的當(dāng)前位置必須是由WriteComponentRes方法所寫入的部件的位置。

              ReadComponentRes 首先調(diào)用ReadResHeader方法從流中讀取資源頭,然后調(diào)用ReadComponent方法讀取Instance。如果流的當(dāng)前位置不包含一個資源頭。ReadResHeader將引發(fā)一個EInvalidImage異常事件。在Classes庫單元中也包含一個名為ReadComponentRes的函數(shù),該函數(shù)執(zhí)行相同的操作,只不過它基于應(yīng)用程序包含的資源建立自己的流。

              8. ReadResHeader方法

              聲明:procedure ReadResHeader;

              ReadResHeader方法從流的當(dāng)前位置讀取Windows資源文件頭,并將流的當(dāng)前位置指針移到該文件頭的尾部。如果流不包含一個有效的資源文件頭,ReadResHeader將引發(fā)一個EInvalidImage異常事件。

              流的ReadComponentRes方法在從資源文件中讀取部件之前,會自動調(diào)用ReadResHeader方法,因此,通常程序員通常不需要自己調(diào)用它。

              9. Seek方法

              聲明:function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;

              Seek方法將流的當(dāng)前指針移動Offset個字節(jié),字節(jié)移動的起點(diǎn)由Origin指定。如果Offset是負(fù)數(shù),Seek方法將從所描述的起點(diǎn)往流的頭部移動。下表中列出了Origin的不同取值和它們的含義:

              表20.1 函數(shù)Seek的參數(shù)的取值

              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

              常量 值 Seek的起點(diǎn) Offset的取值

              ─────────────────────────────────

              SoFromBeginning 0 流的開頭 正 數(shù)

              SoFromCurrent 1 流的當(dāng)前位置 正數(shù)或負(fù)數(shù)

              SoFromEnd 2 流的結(jié)尾 負(fù) 數(shù)

              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

              10. Write方法

              在Delphi對象式管理的對象中有兩類對象的方法都有稱為Write的:Stream對象和Filer對象。Stream對象的Write方法將數(shù)據(jù)寫進(jìn)流中。Filer對象通過相關(guān)的流傳遞數(shù)據(jù),在后文中會介紹這類方法。

              Stream對象的Write方法聲明如下:

              function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

              Write方法將Buffer中的Count個字節(jié)寫入流中,并將當(dāng)前位置指針向流的尾部移動Count個字節(jié),函數(shù)返回寫入的字節(jié)數(shù)。

              TStream的Write方法是抽象的,每個繼承的Stream對象都要通過覆蓋該方法來提供向特定存儲媒介(內(nèi)存、磁盤文件等)寫數(shù)據(jù)的特定方法。流的其它所有寫數(shù)據(jù)的方法(如WriteBuffer、WriteComponent)都調(diào)用Write擔(dān)當(dāng)實(shí)際的寫操作。

              11. WriteBuffer方法

              聲明:procedure WriteBuffer(const Buffer; Count: Longint);

              WriteBuffer的功能與Write相似。WriteBuffer方法調(diào)用Write來執(zhí)行實(shí)際的寫操作,如果流沒能寫所有字節(jié),WriteBuffer會觸發(fā)一個EWriteError異常事件。

              12. WriteComponent方法

              在Stream對象和Filer對象都有被稱為WriteComponent的方法。Stream對象的WriteComponent方法將Instance所指定的部件和它所包含的所有部件都寫入流中;Writer對象的WriteComponent將指定部件的屬性值寫入Writer對象的流中。

              Stream對象的WriteComponent方法聲明是這樣的:

              procedure WriteComponent(Instance: Tcomponent);

              WriteComponent創(chuàng)建一個Writer對象,并調(diào)用Writer的WriteRootComponent方法將Instance及其擁有的對象寫入流。

              13. WriteComponentRes方法

              聲明:WriteComponentRes(const ResName: String; Instance: TComponent);

              WriteComponentRes方法首先往流中寫入標(biāo)準(zhǔn)Windows 資源文件頭,然后將Instance指定的部件寫入流中。要讀由WriteComponentRes寫入的部件,必須調(diào)用ReadComponentRes方法。

              WriteComponentRes使用ResName傳入的字符串作為資源文件頭的資源名,然后調(diào)用WriteComponent方法將Instance和它擁有的部件寫入流。

              14. WriteDescendant方法

              聲明:procedure WriteDescendant(Instance Ancestor: TComponent);

              Stream對象的WriteDescendant方法創(chuàng)建一個Writer對象,然后調(diào)入該對象的WriteDescendant方法將Instance部件寫入流中。Instance可以是從Ancestor部件繼承的窗體,也可以是在從祖先窗體中繼承的窗體中相應(yīng)于祖先窗體中Ancestor部件的部件。

              15. WriteDescendantRes方法

              聲明:procedure WriteDescendantRes(const ResName: String;

              Instance, Ancestor: TComponent);

              WriteDescendantRes方法將Windows資源文件頭寫入流,并使用ResName作用資源名,然后調(diào)用WriteDescendant方法,將Instance寫入流。

              20.1.1.2 TStream的實(shí)現(xiàn)原理

              TStream對象是Stream對象的基礎(chǔ)類,這是Stream對象的基礎(chǔ)。為了能在不同媒介上的存儲數(shù)據(jù)對象,后繼的Stream對象主要是在Read和Write方法上做了改進(jìn),。因此,了解TStream是掌握Stream對象管理的核心。Borland公司雖然提供了Stream對象的接口說明文檔,但對于其實(shí)現(xiàn)和應(yīng)用方法卻沒有提及,筆者是從Borland Delphi 2.0 Client/Server Suite 提供的源代碼和部分例子程序中掌握了流式對象技術(shù)。

              下面就從TStream的屬性和方法的實(shí)現(xiàn)開始。

              1. TStream屬性的實(shí)現(xiàn)

              前面介紹過,TStream具有Position和Size兩個屬性,作為抽象數(shù)據(jù)類型,它抽象了在各種存儲媒介中讀寫數(shù)據(jù)所需要經(jīng)常訪問的域。那么它們是怎樣實(shí)現(xiàn)的呢?

              在自定義部件編寫這一章中介紹過部件屬性定義中的讀寫控制。Position和Size也作了讀寫控制。定義如下:

              property Position: Longint read GetPosition write SetPosition;

              property Size: Longint read GetSize;

              由上可知,Position是可讀寫屬性,而Size是只讀的。

              Position屬性的實(shí)現(xiàn)就體現(xiàn)在GetPosition和SetPosition。當(dāng)在程序運(yùn)行過程中,任何讀取Position的值和給Position賦值的操作都會自動觸發(fā)私有方法GetPosition和SetPosition。兩個方法的聲明如下:

              function TStream.GetPosition: Longint;

              begin

              Result := Seek(0, 1);

              end;

              procedure TStream.SetPosition(Pos: Longint);

              begin

              Seek(Pos, 0);

              end;

              在設(shè)置位置時,Delphi編譯機(jī)制會自動將Position傳為Pos。

              前面介紹過Seek的使用方法,第一參數(shù)是移動偏移量,第二個參數(shù)是移動的起點(diǎn),返回值是移動后的指針位置。

              Size屬性的實(shí)現(xiàn)只有讀控制,完全屏蔽了寫操作。讀控制方法GetSize實(shí)現(xiàn)如下:

              function TStream.GetSize: Longint;

              var

              Pos: Longint;

              begin

              Pos := Seek(0, 1);

              Result := Seek(0, 2);

              Seek(Pos, 0);

              end;

              2. TStream方法的實(shí)現(xiàn)

             、 CopyFrom方法

              CopyFrom是Stream對象中很有用的方法,它用于在不同存儲媒介中拷貝數(shù)據(jù)。例如,內(nèi)存與外部文件之間、內(nèi)存與數(shù)據(jù)庫字段之間等。它簡化了許多內(nèi)存分配、文件打開和讀寫等的細(xì)節(jié),將所有拷貝操作都統(tǒng)一到Stream對象上。

              前面曾介紹:CopyFrom方法帶Source和Count兩個參數(shù)并返回長整型。該方法將Count個字節(jié)的內(nèi)容從Source拷貝到當(dāng)前流中,如果Count值為0則拷貝所有數(shù)據(jù)。

              function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;

              const

              MaxBufSize = $F000;

              var

              BufSize, N: Integer;

              Buffer: PChar;

              begin

              if Count = 0 then

              begin

              Source.Position := 0;

              CouNG="ZH-CN">資源文件中的部件時調(diào)用,通常程序員不需自己調(diào)用。如果讀取的不是資源文件ReadResHeader,將觸發(fā)異常事件。

              procedure TStream.ReadResHeader;

              var

              ReadCount: Longint;

              Header: array[0..79] of Char;

              begin

              FillChar(Header, SizeOf(Header), 0);

              ReadCount := Read(Header, SizeOf(Header) - 1);

              if (Byte((@Header[0])^) = $FF) and (Word((@Header[1])^) = 10) then

              Seek(StrLen(Header + 3) + 10 - ReadCount, 1)

              else

              raise EInvalidImage.CreateRes(SInvalidImage);

              end;

              ReadComponentRes在Windows資源文件中讀取部件,為了判斷是否是資源文件,它首先調(diào)用ReadResHeader方法,然后調(diào)用ReadComponent方法讀取Instance指定的部件。下面是它的實(shí)現(xiàn):

              function TStream.ReadComponentRes(Instance: TComponent): TComponent;

              begin

              ReadResHeader;

              Result := ReadComponent(Instance);

              end;

              與ReadComponentRes相應(yīng)的寫方法是WriteComponentRes,Delphi 調(diào)用這兩個方法讀寫窗體文件(DFM文件),在后面書中會舉用這兩個方法讀取DFM文件的例子。

              ⑷ WriteComponent和WriteDescendant方法

              Stream對象的WriteDescendant方法在實(shí)現(xiàn)過程中,創(chuàng)建了TWriter對象,然后利用TWriter的WriteDescendant方法將Instance寫入流。而WriteComponent方法只是簡單地調(diào)用WriteDescendant方法將Instance寫入流。它們的實(shí)現(xiàn)如下:

              procedure TStream.WriteComponent(Instance: TComponent);

              begin

              WriteDescendent(Instance, nil);

              end;

              procedure TStream.WriteDescendent(Instance, Ancestor: TComponent);

              var

              Writer: TWriter;

              begin

              Writer := TWriter.Create(Self, 4096);

              try

              Writer.WriteDescendent(Instance, Ancestor);

              finally

              Writer.Free;

              end;

              end;

              ⑸ WriteDescendantRes和WriteComponentRes方法

              WriteDescendantRes方法用于將部件寫入Windows資源文件;而WriteComponentRes 方法只是簡單地調(diào)用WriteDescendantRes方法,它們的實(shí)現(xiàn)如下:

              procedure TStream.WriteComponentRes(const ResName: string; Instance:

              TComponent);

              begin

              WriteDescendentRes(ResName, Instance, nil);

              end;

              procedure TStream.WriteDescendentRes(const ResName: string; Instance,

              Ancestor: TComponent);

              var

              HeaderSize: Integer;

              Origin, ImageSize: Longint;

              Header: array[0..79] of Char;

              begin

              Byte((@Header[0])^) := $FF;

              Word((@Header[1])^) := 10;

              HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[3], ResName, 63))) + 10;

              Word((@Header[HeaderSize - 6])^) := $1030;

              Longint((@Header[HeaderSize - 4])^) := 0;

              WriteBuffer(Header, HeaderSize);

              Origin := Position;

              WriteDescendent(Instance, Ancestor);

              ImageSize := Position - Origin;

              Position := Origin - 4;

              WriteBuffer(ImageSize, SizeOf(Longint));

              Position := Origin + ImageSize;

              end;

              WriteCompnentRes是與ReadComponentRes相應(yīng)的對象寫方法,這兩個方法相互配合可讀取Delphi的DFM文件,從而利用Delphi系統(tǒng)的功能。

              20.1.2 THandleStream對象

              THandleStream對象的行為特別象FileStream對象,所不同的是它通過已創(chuàng)建的文件句柄而不是文件名來存儲流中的數(shù)據(jù)。

              THandleStream對象定義了Handle屬性,該屬性提供了對文件句柄的只讀訪問,并且Handle屬性可以作為Delphi的RTL文件管理函數(shù)的參數(shù),利用文件類函數(shù)來讀寫數(shù)據(jù)。THandleStream覆蓋了構(gòu)造函數(shù)Create,該函數(shù)帶有Handle 參數(shù),該參數(shù)指定與THandleStream對象相關(guān)的文件句柄。

              20.1.2.1 THandleStream的屬性的方法:

              1. Handle屬性

              聲明:property Handle: Integer;

              Handle屬性提供了對文件句柄的只讀訪問,該句柄由THandleStream的構(gòu)造方法Create傳入。因此除了用THandleStream提供的方法外,也可以用文件管理函數(shù)對句柄進(jìn)行操作。實(shí)際上,THandleStream的方法在實(shí)現(xiàn)上也是運(yùn)用文件管理函數(shù)進(jìn)行實(shí)際的讀寫操作。

              2. Create方法

              聲明:constructor Create(AHandle: Integer);

              Create方法使用傳入的Handle參數(shù)創(chuàng)建一個與特定文件句柄相聯(lián)的THandleStream對象,并且將AHandle賦給流的Handle屬性。

              3. Read、Write和Seek方法

              這三個方法是TStream的虛方法,只是在THandleStream 中覆蓋了這三個方法,以實(shí)現(xiàn)特定媒介──文件的數(shù)據(jù)存取。后面會詳細(xì)介紹這三個方法的實(shí)現(xiàn)。

              20.1.2.2 THandleStream的實(shí)現(xiàn)原理

              THandleStream是從TStream繼承來的,因此可以共用TStream中的屬性和大多數(shù)方法。THandleStream在實(shí)現(xiàn)上主要是增加了一個屬性Handle和覆蓋了Create、Read、Write和Seek四個方法。

              1. 屬性的實(shí)現(xiàn)

              Handle屬性的實(shí)現(xiàn)正如Delphi大多數(shù)屬性的實(shí)現(xiàn)那樣,先在對象定義的private部分聲明一個存放數(shù)據(jù)的變量FHandle,然后在定義的public部分聲明屬性Handle,其中屬性定義的讀寫控制部分加上只讀控制,讀控制只是直接讀取FHandle變量的值,其實(shí)現(xiàn)如下:

              THandleStream = class(TStream)

              private

              FHandle: Integer;

              public

              …

              property Handle: Integer read FHandle;

              end;

              2. 方法的實(shí)現(xiàn)

              THandleStream的Create方法,以AHandle作為參數(shù),在方法里面只是簡單的將AHandle的值賦給FHandle,其實(shí)現(xiàn)如下:

              constructor THandleStream.Create(AHandle: Integer);

              begin

              FHandle := AHandle;

              end;

              為實(shí)現(xiàn)針對文件的數(shù)據(jù)對象存儲,THandleStream的Read、Write和Seek方法覆蓋了TStream中的相應(yīng)方法。它們的實(shí)現(xiàn)都調(diào)用了Windows的文件管理函數(shù)。

              Read方法調(diào)用FileRead函數(shù)實(shí)現(xiàn)文件讀操作,其實(shí)現(xiàn)如下:

              function THandleStream.Read(var Buffer; Count: Longint): Longint;

              begin

              Result := FileRead(FHandle, Buffer, Count);

              if Result = -1 then Result := 0;

              end;

              Write方法調(diào)用FileWrite函數(shù)實(shí)現(xiàn)文件寫操作,其實(shí)現(xiàn)如下:

              function THandleStream.Write(const Buffer; Count: Longint): Longint;

              begin

              Result := FileWrite(FHandle, Buffer, Count);

              if Result = -1 then Result := 0;

              end;

              Seek方法調(diào)用FileSeek函數(shù)實(shí)現(xiàn)文件指針的移動,其實(shí)現(xiàn)如下:

              function THandleStream.Seek(Offset: Longint; Origin: Word): Longint;

              begin

              Result := FileSeek(FHandle, Offset, Origin);

              end;

              20.1.3 TFileStream對象

              TFileStream對象是在磁盤文件上存儲數(shù)據(jù)的Stream對象。TFileStream是從THandleStream繼承下來的,它和THandleStream一樣都是實(shí)現(xiàn)文件的存取操作。不同之處在于THandleStream用句柄訪問文件,而TFileStream用文件名訪問文件。實(shí)際上TFileStream是THandleStream上的一層包裝,其內(nèi)核是THandleStream的屬性和方法。

              TFileStream中沒有增加新的屬性和方法。它只是覆蓋了的構(gòu)造方法Create和析構(gòu)方法Destory。在Create方法中帶兩個參數(shù)FileName和Mode。FileName描述要創(chuàng)建或打開的文件名,而Mode描述文件模式如fmCreate、fmOpenRead和fmOpenWrite等。Create方法首先使用FileCreate或FileOpen函數(shù)創(chuàng)建或打開名為FileName的文件,再將得到的文件句柄賦給FHandle。TFileStream的文件讀寫操作都是由從THandleStream繼承的Read

              var

              Stream: TStream;

              begin

              Stream := TFileStream.Create(FileName, fmCreate);

              try

              SaveToStream(Stream);

              finally

              Stream.Free;

              end;

              end;

              在Delphi 的許多對象的SaveToStream 和SaveToFile、LoadFromStream和LoadFromFile方法的實(shí)現(xiàn)都有類似的嵌套結(jié)構(gòu)。

              20.1.5 TMemoryStream對象

              TMemoryStream對象是一個管理動態(tài)內(nèi)存中的數(shù)據(jù)的Stream對象,它是從TCustomMemoryStream中繼承下來的,除了從TCustomMemoryStream中繼承的屬性和方法外,它還增加和覆蓋了一些用于從磁盤文件和其它注臺讀數(shù)據(jù)的方法。它還提供了寫入、消除內(nèi)存內(nèi)容的動態(tài)內(nèi)存管理方法。下面介紹它的這些屬性和方法。

              20.1.5.1 TMemoryStream的屬性和方法

              1. Capacity屬性

              聲明:property Copacity: Longint;

              Capacity屬性決定了分配給內(nèi)存流的內(nèi)存池的大小。這與Size屬性有些不同。Size屬性是描述流中數(shù)據(jù)的大小。在程序中可以將Capacity 的值設(shè)置的比數(shù)據(jù)所需最大內(nèi)存大一些,這樣可以避免頻繁地重新分配。

              2. Realloc方法

              聲明:function Realloc(var NewCapacity: Longint): Pointer; virtual;

              Realloc方法,以8K為單位分配動態(tài)內(nèi)存,內(nèi)存的大小由NewCapacity指定,函數(shù)返回指向所分配內(nèi)存的指針。

              3. SetSize方法

              SetSize方法消除內(nèi)存流中包含的數(shù)據(jù),并將內(nèi)存流中內(nèi)存池的大小設(shè)為Size字節(jié)。如果Size為零,是SetSize方法將釋放已有的內(nèi)存池,并將Memory屬性置為nil;否則,SetSize方法將內(nèi)存池大小調(diào)整為Size。

              4. Clear方法

              聲明:procedure Clear;

              Clear方法釋放內(nèi)存中的內(nèi)存池,并將Memory屬性置為nil。在調(diào)用Clear方法后,Size和Position屬性都為0。

              5. LoadFromStream方法

              聲明:procedure LoadFromStream(Stream: TStream);

              LoadFromStream方法將Stream指定的流中的全部內(nèi)容復(fù)制到MemoryStream中,復(fù)制過程將取代已有內(nèi)容,使MemoryStream成為Stream的一份拷貝。

              6. LoadFromFile方法

              聲明:procedure LoadFromFile(count FileName: String);

              LoadFromFile方法將FileName指定文件的所有內(nèi)容復(fù)制到MemoryStream中,并取代已有內(nèi)容。調(diào)用LoadFromFile方法后,MemoryStream將成為文件內(nèi)容在內(nèi)存中的完整拷貝。

              20.1.5.2 TMemoryStream對象的實(shí)現(xiàn)原理

              TMemoryStream從TCustomMemoryStream對象直接繼承,因此可以享用TCustomMemoryStream的屬性和方法。前面講過,TCustomMemoryStream是用于內(nèi)存中數(shù)據(jù)操作的抽象對象,它為MemoryStream對象的實(shí)現(xiàn)提供了框架,框架中的內(nèi)容還要由具體MemoryStream對象去填充。TMemoryStream對象就是按動態(tài)內(nèi)存管理的需要填充框架中的具體內(nèi)容。下面介紹TMemoryStream對象的實(shí)現(xiàn)。

              1. TMemoryStream屬性的實(shí)現(xiàn)

              TMemoryStream在其protected部分增加了一個Capacity屬性,該屬性決定了MemoryStream所占動態(tài)內(nèi)存的大小。TMemoryStream首先在private部分聲明了FCapacity變量作為存儲Capacity屬性值的數(shù)據(jù)域,然后在protected部分聲明了該屬性。在屬性聲明的讀控制部分簡單讀取FCapacity的值,在寫控制處調(diào)用了方法SetCapacity。該方法除了給FCapacity賦值外還執(zhí)行了修改Capacity屬性所必需操作如狀態(tài)改變等。

              下面是屬性的實(shí)現(xiàn):

              TMemoryStream = class(TCustomMemoryStream)

              private

              FCapacity: Longint;

              procedure SetCapacity(NewCapacity: Longint);

              protected

              …

              property Capacity: Longint read FCapacity write SetCapacity;

              public

              …

              end;

              寫控制方法SetCapacity的實(shí)現(xiàn)是這樣的:

              procedure TMemoryStream.SetCapacity(NewCapacity: Longint);

              begin

              SetPointer(Realloc(NewCapacity), FSize);

              FCapacity := NewCapacity;

              end;

              在SetCapacity 方法先是調(diào)用Realloc重新分配內(nèi)存,然后用NewCapacity的值給FCapacity賦值。Realloc方法進(jìn)行某些對象狀態(tài)的改變。

            1 2 3 4 5 6 7 8 9 下一頁
              相關(guān)推薦:2010年9月計算機(jī)等級考試試題及答案解析專題
                   預(yù)告:名師解析2010年9月計算機(jī)等級考試試題答案
                   2010年9月計算機(jī)等級考試成績查詢時間及入口
                   2010年9月計算機(jī)等考成績查詢短信免費(fèi)提醒開通
            文章搜索
            計算機(jī)等級考試欄目導(dǎo)航
            版權(quán)聲明:如果計算機(jī)等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本計算機(jī)等級考試網(wǎng)內(nèi)容,請注明出處。