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

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

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

  12. WriteSignature方法

  聲明:procedure WriteSignature;

  WriteSignature方法將Delphi Filer對(duì)象標(biāo)簽寫入流中。WriteRootComponent方法在將部件寫入流之前先調(diào)用WriteSignature方法寫入Filer標(biāo)簽。Reader對(duì)象在讀部件之前調(diào)用ReadSignature方法讀取該標(biāo)簽以指導(dǎo)讀操作。

  13. WritComponent方法

  聲明:procedure WriteComponent(Component: TComponent);

  WriteComponent方法調(diào)用參數(shù)Component的WriteState方法將部件寫入流中。在調(diào)用WriteState之前,WriteComponent還將Component的ComponetnState屬性置為csWriting。當(dāng)WriteState返回時(shí)再清除csWriting.

  14. WriteRootComponent方法

  聲明:procedure WriteRootComponent(Root: TComponent);

  WriteRootComponent方法將Writer對(duì)象Root屬性設(shè)為參數(shù)Root帶的值,然后調(diào)用WriteSignature方法往流中寫入Filer對(duì)象標(biāo)簽,最后調(diào)用WriteComponent方法在流中存儲(chǔ)Root部件。

  20.2.2.2 TWriter對(duì)象的實(shí)現(xiàn)

  TWriter對(duì)象提供了許多往流中寫各種類型數(shù)據(jù)的方法,這對(duì)于程序員來說是很重要的功能。TWrite對(duì)象往流中寫數(shù)據(jù)是依據(jù)不同的數(shù)據(jù)采取不同的格式的。 因此要掌握TWriter對(duì)象的實(shí)現(xiàn)和應(yīng)用方法,必須了解Writer對(duì)象存儲(chǔ)數(shù)據(jù)的格式。

  首先要說明的是,每個(gè)Filer對(duì)象的流中都包含有Filer對(duì)象標(biāo)簽。該標(biāo)簽占四個(gè)字節(jié)其值為“TPF0”。Filer對(duì)象為WriteSignature和ReadSignature方法存取該標(biāo)簽。該標(biāo)簽主要用于Reader對(duì)象讀數(shù)據(jù)(部件等)時(shí),指導(dǎo)讀操作。

  其次,Writer對(duì)象在存儲(chǔ)數(shù)據(jù)前都要留一個(gè)字節(jié)的標(biāo)志位,以指出后面存放的是什么類型的數(shù)據(jù)。該字節(jié)為TValueType類型的值。TValueType是枚舉類型,占一個(gè)字節(jié)空間,其定義如下:

  TValueType = (VaNull, VaList, VaInt8, VaInt16, VaInt32, VaEntended, VaString, VaIdent,

  VaFalse, VaTrue, VaBinary, VaSet, VaLString, VaNil, VaCollection);

  因此,對(duì)Writer對(duì)象的每一個(gè)寫數(shù)據(jù)方法,在實(shí)現(xiàn)上,都要先寫標(biāo)志位再寫相應(yīng)的數(shù)據(jù);而Reader對(duì)象的每一個(gè)讀數(shù)據(jù)方法都要先讀標(biāo)志位進(jìn)行判斷,如果符合就讀數(shù)據(jù),否則產(chǎn)生一個(gè)讀數(shù)據(jù)無效的異常事件。VaList標(biāo)志有著特殊的用途,它是用來標(biāo)識(shí)后面將有一連串類型相同的項(xiàng)目,而標(biāo)識(shí)連續(xù)項(xiàng)目結(jié)束的標(biāo)志是VaNull。因此,在Writer對(duì)象寫連續(xù)若干個(gè)相同項(xiàng)目時(shí),先用WriteListBegin寫入VaList標(biāo)志,寫完數(shù)據(jù)項(xiàng)目后,再寫出VaNull標(biāo)志;而讀這些數(shù)據(jù)時(shí),以ReadListBegin開始,ReadListEnd結(jié)束,中間用EndofList函數(shù)判斷是否有VaNull標(biāo)志。

  下面就介紹它們的實(shí)現(xiàn)。

  1. TWriter對(duì)象屬性的實(shí)現(xiàn)

  TWriter對(duì)象直接從TFiler對(duì)象繼承,它只增加了Position和RootAncestor屬性。

  RootAncestor屬性在private部分有數(shù)據(jù)域FRootAncestor存入其值。在屬性定義的讀與控制上都是直接讀取該值。

  Position屬性的定義中包含了兩個(gè)讀寫控制方法:GetPosition和SetPosition:

  TWriter = class(TFiler)

  private

  FRootAncestor: TComponent;

  …

  function GetPosition: Longint;

  procedure SetPosition(Value: Longint);

  public

  …

  property Position: Longint read GetPosition write SetPosition;

  property RootAncestor: TComponent read FRootAncestor write FRootAncestor;

  end;

  GetPosition和SetPosition方法實(shí)現(xiàn)如下:

  function TWriter.GetPosition: Longint;

  begin

  Result := FStream.Position + FBufPos;

  end;

  procedure TWriter.SetPosition(Value: Longint);

  var

  StreamPosition: Longint;

  begin

  StreamPosition := FStream.Position;

  { 只清除越界的緩沖區(qū) }

  if (Value < StreamPosition) or (Value > StreamPosition + FBufPos) then

  begin

  WriteBuffer;

  FStream.Position := Value;

  end

  else FBufPos := Value - StreamPosition;

  end;

  WriteBuffer是TWriter對(duì)象定義的私有方法,它的作用是將Writer 對(duì)象內(nèi)部緩沖區(qū)中的有效數(shù)據(jù)寫入流中,并將FBufPos置為0。Writer對(duì)象的FlushBuffer對(duì)象就是用WriteBuffer方法刷新緩沖區(qū)。

  在SetPosition方法中,如果Value值超出了邊界(FStream.Position,F(xiàn)Stream.Position + FBufPos),就將緩沖區(qū)中的內(nèi)容寫入流,重新設(shè)置緩沖區(qū)在流中的相對(duì)位置;否則,就只是移動(dòng)FBufPos指針。

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

 、 WriteListBegin和WriteListEnd的實(shí)現(xiàn)

  這兩個(gè)方法都是用于寫連續(xù)若干個(gè)相同類型的值。WriteListBegin寫入VaList標(biāo)志,WriteListEnd寫入VaNull標(biāo)志。

  procedure TWriter.WriteListBegin;

  begin

  WriteValue(vaList);

  end;

  procedure TWriter.WriteListEnd;

  begin

  WriteValue(vaNull);

  end;

  這兩個(gè)方法都調(diào)用TWriter對(duì)象的WriteValue方法,該方法主要用于寫入TValueType類型的值。

  procedure TWriter.WriteValue(Value: TValueType);

  begin

  Write(Value, SizeOf(Value));

  end;

 、 簡(jiǎn)單數(shù)據(jù)類型的寫入

  簡(jiǎn)單數(shù)據(jù)類型指的是整型、字符型、字符串型、浮點(diǎn)型、布爾型等。TWriter對(duì)象都定義了相應(yīng)的寫入方法。

  WriteInteger方法用于寫入整型數(shù)據(jù)。

  procedure TWriter.WriteInteger(Value: Longint);

  begin

  if (Value >= -128) and (Value <= 127) then

  begin

  WriteValue(vaInt8);

  Write(Value, SizeOf(Shortint));

  end else

  if (Value >= -32768) and (Value <= 32767) then

  begin

  WriteValue(vaInt16);

  Write(Value, SizeOf(Smallint));

  end else

  begin

  WriteValue(vaInt32);

  Write(Value, SizeOf(Longint));

  end;

  end;

  WriteInteger方法將整型數(shù)據(jù)分為8位、16位和32位三種,并分別用vaInt8、vaInt16和VaInt32。

  WriteBoolean用于寫入布爾型數(shù)據(jù):

  procedure TWriter.WriteBoolean(Value: Boolean);

  begin

  if Value then

  WriteValue(vaTrue) else

  WriteValue(vaFalse);

  end;

  與其它數(shù)據(jù)類型不同的是布爾型數(shù)據(jù)只使用了標(biāo)志位是存儲(chǔ)布爾值,在標(biāo)志位后沒有數(shù)據(jù)。

  WriteFloat方法用于寫入浮點(diǎn)型數(shù)據(jù)。

  procedure TWriter.WriteFloat(Value: Extended);

  begin

  WriteValue(vaExtended);

  Write(Value, SizeOf(Extended));

  end;

  字符串“True”、“False”和“nil”作為標(biāo)識(shí)符傳入是由于Delphi的特殊需要。如果是“True”、“False”和“nil”則寫入VaTrue、VaFalse和VaNil,否則寫入VaIdent標(biāo)志,接著以字符串形式寫入標(biāo)識(shí)符。

  WriteString方法用于寫入字符串

  procedure TWriter.WriteString(const Value: string);

  var

  L: Integer;

  begin

  L := Length(Value);

  if L <= 255 then

  begin

  WriteValue(vaString);

  Write(L, SizeOf(Byte));

  end else

  begin

  WriteValue(vaLString);

  Write(L, SizeOf(Integer));

  end;

  Write(Pointer(Value)^, L);

  end;

  Delphi的字符串類型有兩種。一種長(zhǎng)度小于256個(gè)字節(jié),另一種長(zhǎng)度小于65536 個(gè)字節(jié)。WriteString方法區(qū)分這兩類情況存儲(chǔ)字符串,一種設(shè)置VaStirng標(biāo)志,另一種設(shè)置VaLString。然后存儲(chǔ)字符串的長(zhǎng)度值,最后存儲(chǔ)字符串?dāng)?shù)據(jù)。

  WriteChar方法用于寫入字符。

  procedure TWriter.WriteChar(Value: Char);

  begin

  WriteString(Value);

  end;

  字符類型的讀寫是用讀寫字符串的方法,在讀的時(shí)候,判斷字節(jié)數(shù)為1時(shí),則為字符型。

 、 部件的寫入

  TWriter對(duì)象中與寫入部件有關(guān)的方法有WriteSignature、WritePrefix、WriteComponent、WriteDescendant和WriteRootComponent。

  WriteSignature方法用于往流中寫入Filer對(duì)象標(biāo)簽。

  procedure TWriter.WriteSignature;

  begin

  Write(FilerSignature, SizeOf(FilerSignature));

  end;

  FilerStgnature是字符串常量,其值為“TPF0”,代表對(duì)象標(biāo)簽。

  WritePrefix方法用于在寫入部件前寫入ffInherited和ffChildPos標(biāo)志,這些標(biāo)志表示部件的繼承特征和創(chuàng)建序值特征。

  procedure TWriter.WritePrefix(Flags: TFilerFlags; AChildPos: Integer);

  var

  Prefix: Byte;

  begin

  if Flags <> [] then

  begin

  Prefix := $F0 or Byte(Flags);

  Write(Prefix, SizeOf(Prefix));

  if ffChildPos in Flags then WriteInteger(AChildPos);

  end;

  end;

  如果ffChildPos置位,則存入部件在Owner中的創(chuàng)建序值。更詳細(xì)的信息請(qǐng)參閱TReader的ReadPrefix方法。

  WriteComponent方法往流中寫入部件。

  procedure TWriter.WriteComponent(Component: TComponent);

  function FindAncestor(const Name: string): TComponent;

  begin

  …

  end;

  begin

  Include(Component.FComponentState, csWriting);

  if Assigned(FAncestorList) then

  Ancestor := FindAncestor(Component.Name);

  Component.WriteState(Self);

  Exclude(Component.FComponentState, csWriting);

  end;

  方法中用Component的WritState方法寫入部件的屬性。在寫入之前將Component.FComponentState置為csWriting寫入完后再將csWriting復(fù)位。

  WriteDescendant是根據(jù)祖先AAncestor的情況寫入部件Root。

  procedure TWriter.WriteDescendent(Root: TComponent; AAncestor: TComponent);

  begin

  FRootAncestor := AAncestor;

  FAncestor := AAncestor;

  FRoot := Root;

  WriteSignature;

  WriteComponent(Root);

  end;

  方法先調(diào)用WriteSignature方法寫入Filer對(duì)象標(biāo)簽。然后調(diào)用WriteComponent將部件Root寫入流。

  WriteRootComponent方法則是調(diào)用WriteDescendant方法寫入部件,只是將后者的Ancestor參數(shù)以nil值傳入。

  procedure TWriter.WriteRootComponent(Root: TComponent);

  begin

  WriteDescendent(Root, nil);

  end;

  20.2.3 TReader對(duì)象

  TReader對(duì)象是可實(shí)例化的用于從相聯(lián)系的流中讀取數(shù)據(jù)的Filer對(duì)象。TReader對(duì)象從TFiler繼承下來,除了從TFiler繼承的屬性和方法外,TReader聲明了不少屬性、方法和事件。

  Owner和Parent屬性用于表示從Reader對(duì)象的流中讀取的部件的擁有者和雙親結(jié)點(diǎn)。OnError,OnFindMethod和OnSetName事件使應(yīng)用程序在運(yùn)行中讀數(shù)據(jù)時(shí)能定制響應(yīng)方式。除了覆蓋了一些從TFiler對(duì)象中繼承的方法外,TReader對(duì)象還定義大量的讀不同類型的數(shù)據(jù)和觸發(fā)事件的方法。

  20.2.3.1 TReader對(duì)象的屬性和方法

  1. Owner屬性

  聲明:property Owner: TComponent;

  Reader對(duì)象的Owner屬性存儲(chǔ)了將用來給從Reader的流中讀出的部件的Owner屬性賦值的部件。

  2. Parent屬性

  聲明:property Parent: TComponent;

  Parent屬性存儲(chǔ)將用來給從Reader的流中讀出所有控制的Parent屬性賦值的部件。

  3. Position屬性

  聲明:propertion: Longint;

  Reader對(duì)象的Position屬性表示相聯(lián)的流中讀的當(dāng)前位置。Position的值還應(yīng)包括讀緩沖區(qū)的大小。對(duì)于Reader 對(duì)象,Position的值大于流的Position 的值。如果將Position的值設(shè)得超過當(dāng)前緩沖區(qū),將引起調(diào)用FlushBuffer。

  4. BeginReferences方法

  聲明:procedure BeginReferences;

  BeginReferences方法啟動(dòng)一連串關(guān)于讀部件的命令,這些部件包含相互間的交叉引用。在使用上通常和FixupReferences和EndReferences一起放在Try…finally程序塊中。

  在調(diào)用了BeginReferences后,Reader對(duì)象創(chuàng)建讀取所有對(duì)象和名字的列表。所有的獨(dú)立對(duì)象被讀出后,調(diào)用FixupReferences方法將名字的相互從流中轉(zhuǎn)移到對(duì)象實(shí)例中。最后調(diào)用EndReferences方法釋放列表。

  處理部件相互引用的程序塊形式如下:

  BeginReferences; { 創(chuàng)建臨時(shí)列表 }

  try

  { 讀出所有部件并將它們的名字放在一臨時(shí)列表中 }

  …

  FixupReferences; { 分 解 }

  finally

  EndReferences; { 釋放臨時(shí)列表 }

  end;

  5. FixUpReferences方法

  聲明:procedure FixupReferences;

  FixupReferences方法分解從流中讀出的存在各種相互依賴部件的引用關(guān)系。FixupReferences總在try…finally塊中并配合BeginReferences和EndReferences一起使用。

  6. EndReferences方法

  聲明:procedure EndReferences;

  EndReferences方法終止處理相互引用的塊操作,釋放對(duì)象列表。它總配合BeginReferences和FixupReferences一起使用。

  7. ReadListBegin方法

  聲明:procedure ReadListBegin;

  ReadListBegin方法從Reader對(duì)象相聯(lián)的流中讀取列表開始標(biāo)志。如果流中緊接著要讀取的項(xiàng)目不是一個(gè)由WritelistBegin方法寫入的列表起始標(biāo)志,ReadListBegin將引起一個(gè)讀異常事件。

  通常在調(diào)用ReadlistBegin方法之后,緊跟著一個(gè)讀項(xiàng)目的循環(huán),循環(huán)以EndfList方法返回True 終止條件。這時(shí),預(yù)示流中的下一個(gè)項(xiàng)目是列表結(jié)束標(biāo)志,需要調(diào)用ReadListEnd方法。

  8. ReadListEnd方法

  聲明:procedure ReadListEnd;

  ReadListEnd 方法從流中讀取列表結(jié)束標(biāo)志。如果所讀的項(xiàng)目不是一個(gè)列表結(jié)束標(biāo)志,ReadListEnd方法引發(fā)一個(gè)EReadError異常事件。

  9. EndOfList方法

  聲明:function EndOfList: Boolean;

  如果Reader對(duì)象讀到項(xiàng)目列表結(jié)果標(biāo)志,EndOfList方法返回True。

  TStrings對(duì)象在從Reader對(duì)象讀取項(xiàng)目列表時(shí)使用了ReadListBegin和ReadListEnd方法。下面的ReadData是TStrings的方法,用于在DefineProperties方面中讀string數(shù)據(jù)。

  procedure TStrings.ReadData(Reader: TReader);

  begin

  Reader.ReadListBegin; { 讀列表開始標(biāo)志 }

  Clear; { 清除已有的字符串 }

  while not Reader.EndOfList do { 只要還有數(shù)據(jù) … }

  Add(Reader.ReadString); { …讀一個(gè)字符串并將其加在列表中 }

  Reader.ReadListEnd; { 越過列表結(jié)束標(biāo)志 }

  end;

  10. ReadSignature方法

  聲明:procedure ReadSignature;

  ReadSignature方法從流中讀取部件之前首先調(diào)用ReadSignature方法。在載入對(duì)象之前檢測(cè)標(biāo)簽。Reader對(duì)象就能防止疏忽大意,導(dǎo)致讀取無效或過時(shí)的數(shù)據(jù)。Filer標(biāo)簽是四個(gè)字符,對(duì)于Delphi 2.0,該標(biāo)簽是“TPF0”。

  11. ReadPrefix方法

  聲明:procedure ReadPrefix(var Plags: TFilerFlags; var AChild, Pos: Integer);

  ReadPrefix方法的功能與ReadSignature的很相象,只不過它是讀取流中部件前面的標(biāo)志(PreFix)。當(dāng)一個(gè)Write對(duì)象將部件寫入流中時(shí),它在部件前面預(yù)寫了兩個(gè)值,第一個(gè)值是指明部件是否是從祖先窗體中繼承的窗體和它在窗體中的位置是否重要的標(biāo)志;第二個(gè)值指明它在祖先窗體創(chuàng)建次序。ReadComponent方法自動(dòng)調(diào)用ReadPrefix。但如果需要獨(dú)立讀取部件的預(yù)讀標(biāo)志,也可直接調(diào)用該方向。

  12. OnFindMethod事件

  聲明:property OnFindMethod: TFindMethodEvent;

  OnFindMethod事件,發(fā)生在Reader對(duì)象讀取對(duì)象的方法指針時(shí),屬性為方法指針的通常都是事件。

  響應(yīng)OnFindMethod事件的理由,通常是處理過程找不到方法的情況。在FindMethod方法沒有找到由Name指定的方法的情況下,如果它將OnFindMethod方法的Error 參數(shù)設(shè)為True,將引起ReadError異常事件;反之,將Error參數(shù)置為False,將防止FindMethod方法引發(fā)異常事件。

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