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

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

2022-06-13   來源: Delphi編程 

  function TStreamReadComponentRes(Instance: TComponent) TComponent;

  begin

  ReadResHeader;

  Result := ReadComponent(Instance)

  end;

  與ReadComponentRes相應的寫方法是WriteComponentResDelphi 調用這兩個方法讀寫窗體文件(DFM文件)在後面書中會舉用這兩個方法讀取DFM文件的例子

  ⑷ WriteComponent和WriteDescendant方法

  Stream對象的WriteDescendant方法在實現過程中創建了TWriter對象然後利用TWriter的WriteDescendant方法將Instance寫入流而WriteComponent方法只是簡單地調用WriteDescendant方法將Instance寫入流它們的實現如下

  procedure TStreamWriteComponent(Instance: TComponent)

  begin

  WriteDescendent(Instance nil)

  end;

  procedure TStreamWriteDescendent(Instance Ancestor: TComponent)

  var

  Writer: TWriter;

  begin

  Writer := TWriterCreate(Self

  try

  WriterWriteDescendent(Instance Ancestor)

  finally

  WriterFree;

  end;

  end;

  ⑸ WriteDescendantRes和WriteComponentRes方法

  WriteDescendantRes方法用於將部件寫入Windows資源文件而WriteComponentRes 方法只是簡單地調用WriteDescendantRes方法它們的實現如下

  procedure TStreamWriteComponentRes(const ResName: string; Instance:

  TComponent)

  begin

  WriteDescendentRes(ResName Instance nil)

  end;

  procedure TStreamWriteDescendentRes(const ResName: string; Instance

  Ancestor: TComponent)

  var

  HeaderSize: Integer;

  Origin ImageSize: Longint;

  Header: array[] of Char;

  begin

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

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

  HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[] ResName ))) + ;

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

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

  WriteBuffer(Header HeaderSize)

  Origin := Position;

  WriteDescendent(Instance Ancestor)

  ImageSize := Position Origin;

  Position := Origin ;

  WriteBuffer(ImageSize SizeOf(Longint))

  Position := Origin + ImageSize;

  end;

  WriteCompnentRes是與ReadComponentRes相應的對象寫方法這兩個方法相互配合可讀取Delphi的DFM文件從而利用Delphi系統的功能

   THandleStream對象

  THandleStream對象的行為特別象FileStream對象所不同的是它通過已創建的文件句柄而不是文件名來存儲流中的數據

  THandleStream對象定義了Handle屬性該屬性提供了對文件句柄的只讀訪問並且Handle屬性可以作為Delphi的RTL文件管理函數的參數利用文件類函數來讀寫數據THandleStream覆蓋了構造函數Create該函數帶有Handle 參數該參數指定與THandleStream對象相關的文件句柄

   THandleStream的屬性的方法

   Handle屬性

  聲明

property Handle: Integer;

  Handle屬性提供了對文件句柄的只讀訪問該句柄由THandleStream的構造方法Create傳入因此除了用THandleStream提供的方法外也可以用文件管理函數對句柄進行操作實際上THandleStream的方法在實現上也是運用文件管理函數進行實際的讀寫操作

   Create方法

  聲明

constructor Create(AHandle: Integer)

  Create方法使用傳入的Handle參數創建一個與特定文件句柄相聯的THandleStream對象並且將AHandle賦給流的Handle屬性

   ReadWrite和Seek方法

  這三個方法是TStream的虛方法只是在THandleStream 中覆蓋了這三個方法以實現特定媒介──文件的數據存取後面會詳細介紹這三個方法的實現

   THandleStream的實現原理

  THandleStream是從TStream繼承來的因此可以共用TStream中的屬性和大多數方法THandleStream在實現上主要是增加了一個屬性Handle和覆蓋了CreateReadWrite和Seek四個方法

   屬性的實現

  Handle屬性的實現正如Delphi大多數屬性的實現那樣先在對象定義的private部分聲明一個存放數據的變量FHandle然後在定義的public部分聲明屬性Handle其中屬性定義的讀寫控制部分加上只讀控制讀控制只是直接讀取FHandle變量的值其實現如下

  THandleStream = class(TStream)

  private

  FHandle: Integer;

  public

  …

  property Handle: Integer read FHandle;

  end;

   方法的實現

  THandleStream的Create方法以AHandle作為參數在方法裡面只是簡單的將AHandle的值賦給FHandle其實現如下

  constructor THandleStreamCreate(AHandle: Integer)

  begin

  FHandle := AHandle;

  end;

  為實現針對文件的數據對象存儲THandleStream的ReadWrite和Seek方法覆蓋了TStream中的相應方法它們的實現都調用了Windows的文件管理函數

  Read方法調用FileRead函數實現文件讀操作其實現如下

  function THandleStreamRead(var Buffer; Count: Longint) Longint;

  begin

  Result := FileRead(FHandle Buffer Count)

  if Result = then Result := ;

  end;

  Write方法調用FileWrite函數實現文件寫操作其實現如下

[]  []  []  []  []  


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