熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:開發Delphi對象式數據管理功能(四)[2]

2013-11-23 17:47:47  來源: Delphi編程 

   OnSetName事件

  聲明

property OnSetName: TSetNameEvent;

  OnSetName事件發生在Read對象設置部件的Name屬性前OnSetName事件處理過程的var參數Name參數是一個var參數因此事件處理過程再將Name賦給部件前可以修改Name的值這對於想過濾窗體中部件的名字是很有幫助的

  下面的OnSetName事件處理過程命名了名字中包含Button的部件並用PushButton替代

  procedure TFormReaderSetName(Reader: TReader; Component: TComponent;

  var Name: string)

  var

  ButtonPos: Integer;

  begin

  ButtonPos := Pos(Button Name)

  if ButtonPos <> then

  Name := Copy(Name ButtonPos ) + PushButton +

  Copy(Name ButtonPos + Length(Name))

  end;

   ReadValue方法

  聲明

function ReadValue: TValueType;

  ReadValue方法讀取流中緊著的項目的類型函數返回後流的指針移到值類型指示符之後

  TValueType是枚舉類型存儲在Filer對象的流中的每個項目之前都有一個字節標識該項目的類型在讀每個項目之前都要讀取該字節以指導調用哪個方法來闱取項目該字節的值就TValuetype定義的值類型之一

   NextValue方法

  聲明

function Nextvalue: TValuetype;

  Nextvalue方法的作用也是返回Reader對象流中緊接著的項目的類型它與ReadValue的區別在於並不移動指針位置

   ReadBoolean方法

  聲明

function ReadBoolean: Boolean;

  ReadBoolean方法從Reader對象的流中讀取一個布爾值並相應地移動流位置指針

  ReadChar方法

  聲明

function ReadChar: char;

  ReadChar方法從Reader對象的流中讀取一個字符

   ReadFloat方法

  聲明

function ReadFloat: Extended;

  ReadFloat方法從流中讀取浮點數

   ReadIdent方法

  聲明

function ReadIdent: string;

  ReadIdent方法從流中讀取標識符

   ReadInteger方法

  聲明

function ReadInteger: Longin

  ReadInteger方法從流中讀取整型數字

  ReadString方法

  聲明

function Read String: string;

  ReadString方法從Reader對象的流中讀取一個字符串並返回字符串中的內容該字符串是由Writer對象的WriteString方法寫入

   TReader對象的實現

  Filer對象的作用主要是Delphi用來在DFM文件中讀寫各種類型的數據(包括部件對象)這些數據的一個本質特征是變長而且Filer對象將讀寫數據操作抽象化包裝成對象提供了大量的讀寫方法方便了程序的調用因此在應用程序中可以廣泛使Filer對象充分利用Delphi的面向對象技術而且Filer對象與Stream對象捆綁在一起一方面可以在各種存儲媒介中存取任意格式的數據另一方面由於充分利用面向對象的動態聯編各種讀寫方法的使用方法是一致的因此方法調用很簡單下面我們著重介紹Reader 對象中與讀寫數據操作有關的屬性和方法的實現

   TReader屬性的實現

  在TReader對象的屬性實現中我們重點介紹Position的實現

  Position屬性的定義了使用了讀寫控制它們分別是GetPosition和SetPosition方法

  TReader = class(TFiler)

  private

  …

  function GetPosition: Longint;

  procedure SetPosition(Value: Longint)

  public

  …

  property Position: Longint read GetPosition write SetPosition;

  end;

  Postition的讀寫控制方法如下

  function TReaderGetPosition: Longint;

  begin

  Result := FStreamPosition + FBufPos;

  end;

  procedure TReaderSetPosition(Value: Longint)

  begin

  FStreamPosition := Value;

  FBufPos := ;

  FBufEnd := ;

  end;

  在TReader的父對象TFiler對象中介紹過FBufPos和FBufEnd變量Filer對象內部分配了一個BufSize大小的緩沖區FBufPos就是指在緩沖區中的相對位置FBufEnd是指在緩沖區中數據結束處的位置(緩沖區中的數據不一定會充滿整個緩沖區)

  在GetPosition方法中可以看到Reader對象的Position值和Stream對象的Position值是不同的Reader對象多了一個FButPos的編移量

   Defineproperty和DefineBinaryproperty方法的實現

  這兩個方法是虛方法在TFiler中是抽象方法在TReader和TWriter對象中才有具體的實現

  它們在TReader中的實現如下

  procedure TReaderDefineProperty(const Name: string; ReadData: TReaderProc;

  WriteData: TWriterProc; HasData: Boolean)

  begin

  if CompareText(Name FPropName) = then

  begin

  ReadData(Self)

  FPropName := ;

  end;

  end;

  procedure TReaderDefineBinaryProperty(const Name: string;

  ReadData WriteData: TStreamProc; HasData: Boolean)

  var

  Stream: TMemoryStream;

  Count: Longint;

  begin

  if CompareText(Name FPropName) = then

  begin

  if ReadValue <> vaBinary then

  begin

  Dec(FBufPos)

  SkipValue;

  FCanHandleExcepts := True;

  PropValueError;

  end;

  Stream := TMemoryStreamCreate;

  try

  Read(Count SizeOf(Count))

  StreamSetSize(Count)

  Read(StreamMemory^ Count)

  FCanHandleExcepts := True;

  ReadData(Stream)

  finally

  StreamFree;

  end;

  FPropName := ;

  end;

  end;

  在兩個方法都將Name參數值與當前的屬性名比較如果相同則進行讀操作在DefineBinaryproperty中創建了一個內存流先將數據讀到內存流中然後調用ReadData讀取數據

   FlushBuffer的實現

  FlushBuffer方法用於清除Reader對象的內部緩沖區中的內容保持Reader對象和流在位置(Position)上的同步其實現如下

  procedure TReaderFlushBuffer;

  begin

  FStreamPosition := FStreamPosition (FBufEnd FBufPos)

  FBufPos := ;

  FBufEnd := ;

  end;

   ReadListBeginReadListEnd和EndOfList方法

  這三個方法都是用於從Reader對象的流中讀取一連串的項目並且這些項目都由WriteListBegin寫入的標志標定開始和WriteListEnd寫入標志標定結束在讀循環中用EndOfList進行判斷它們是在Reader對象讀取流中數據時經常用於的它們的實現如下

  procedure TReaderReadListBegin;

  begin

  CheckValue(vaList)

  end;

  procedure TReaderReadListEnd;

  begin

  CheckValue(vaNull)

  end;

  function TReaderEndOfList: Boolean;

  begin

  Result := ReadValue = vaNull;

  Dec(FBufPos)

  end;

  項目表開始標志是VaList項目表結束標志是VaNullVaList和VaNull都是枚舉類型TValueType定義的常量

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25093.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.