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

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

2022-06-13   來源: Delphi編程 

  ReadComponent方法主要是調用ReadComponent方法從Reader對象的流中讀取一連串相關聯的部件並分解相互引用關系

  procedure TReaderReadComponents(AOwner AParent: TComponent;

  Proc: TReadComponentsProc)

  var

  Component: TComponent;

  begin

  Root := AOwner;

  Owner := AOwner;

  Parent := AParent;

  BeginReferences;

  try

  while not EndOfList do

  begin

  ReadSignature;

  Component := ReadComponent(nil)

  Proc(Component)

  end;

  FixupReferences;

  finally

  EndReferences;

  end;

  end;

  ReadComponents首先用AOwner和AParent參數給RootOwner和Parent賦值用於重建各部件的相互引用然後用一個While循環讀取部件並用由Proc傳入的方法進行處理在重建引用關系時用了BeginReferencesFixUpReferences和EndReferences嵌套模式

  ReadRootComponent方法從Reader對象的流中將部件及其擁有的部件全部讀出如果Component參數為nil則創建一個相同類型的部件最後返回該部件

  function TReaderReadRootComponent(Root: TComponent) TComponent;

  function FindUniqueName(const Name: string) string;

  begin

  …

  end;

  var

  I: Integer;

  Flags: TFilerFlags;

  begin

  ReadSignature;

  Result := nil;

  try

  ReadPrefix(Flags I)

  if Root = nil then

  begin

  Result := TComponentClass(FindClass(ReadStr))Create(nil)

  ResultName := ReadStr;

  end else

  begin

  Result := Root;

  ReadStr; { Ignore class name }

  if csDesigning in ResultComponentState then

  ReadStr else

  ResultName := FindUniqueName(ReadStr)

  end;

  FRoot := Result;

  if GlobalLoaded <> nil then

  FLoaded := GlobalLoaded else

  FLoaded := TListCreate;

  try

  FLoadedAdd(FRoot)

  FOwner := FRoot;

  Include(FRootFComponentState csLoading)

  Include(FRootFComponentState csReading)

  FRootReadState(Self)

  Exclude(FRootFComponentState csReading)

  if GlobalLoaded = nil then

  for I := to FLoadedCount do TComponent(FLoaded[I])Loaded;

  finally

  if GlobalLoaded = nil then FLoadedFree;

  FLoaded := nil;

  end;

  GlobalFixupReferences;

  except

  RemoveFixupReferences(Root

  if Root = nil then ResultFree;

  raise;

  end;

  end;

  ReadRootComponent首先調用ReadSignature讀取Filer對象標簽然後在try…except循環中執行讀取任務如果Root參數為nil則用ReadStr讀出的類名創建新部件並以流中讀出部件的Name屬性否則忽略類名並判斷Name屬性的唯一性最後用Root的ReadState方法讀取屬性和其擁有的擁有並處理引用關系

   SetName方法和OnSetName事件

  因為在OnSetName事件中Name參數是var型的所以可以用OnSetName事件處理過程修改所讀部件的名字而OnSetName事件處理過程是在SetName方法中實現的

  procedure TReaderSetName(Component: TComponent; var Name: string)

  begin

  if Assigned(FOnSetName) then FOnSetName(Self Component Name)

  ComponentName := Name;

  end;

  SetName方法和OnSetName事件在動態DFM文件的編程中有很重要的作用

   TReader的錯誤處理

  TReader的錯誤處理是由Error方法和OnError事件的配合使用完成的OnError 事件處理過程的Handled參數是var型的布爾變量通過將Handled設為True或False可影響TReader 的錯誤處理OnError事件處理過程是在Error方法中調用的

  function TReaderError(const Message: string) Boolean;

  begin

  Result := False;

  if Assigned(FOnError) then FOnError(Self Message Result)

  end;

   FindMethod和OnFindMethod事件

  有時在程序運行期間給部件的方法指針(主要是事件處理過程)動態賦值是很有用的這樣就能動態地改變部件響應事件的方式在流中讀取部件捍做到一點就要利用OnFindMehtod事件OnFIndMethod事件是在FindMethod方法中被調用的

  function TReaderFindMethod(Root: TComponent;

  const MethodName: string) Pointer;

  var

  Error: Boolean;

  begin

  Result := RootMethodAddress(MethodName)

  Error := Result = nil;

  if Assigned(FOnFindMethod) then FOnFindMethod(Self MethodName Result

  Error)

  if Error then PropValueError;

  end;

  OnFindMethod 方法除了可以給部件的MethodName所指定的方法指針動態賦值外還可修改Error參數來決定是否處理Missing Method錯誤方法中調用的MehtodAddress 方法定義在TObject中它是個很有用的方法它可以得到對象中定義的public方法的地址FindMethod方法和OnFindMethod事件在動態DFM的編程中有很重要的作用

   Delphi對象式數據管理應用實例

  Delphi 無論是其可視化設計工具還是可視化部件類庫(VCL)都處處滲透了對象存儲技術本節將從Delphi可視化設計內部機制VCL中的數據存儲BLOB數據操作和動態生成部件的存儲幾方面介紹對象存儲功能的實例應用

   Delphi 動態DFM文件及部件的存取在超媒體系統中的應用

  Delphi的可視化設計工具是同其部件類庫緊密結合在一起的

  每個部件只有通過一段注冊程序並通過Delphi的Install Component功能才能出現在Component Palette上部件的屬性才有可能出現在Object Inspector窗口中部件的屬性編輯器才能被Delphi環境使用因為這種渾然天成的關系DFM文件存取必然得到VCL在程序上的支持

  DFM文件的部件存取是Delphi可視化設計環境中文件存取的中心問題因為Delphi可視化設計的核心是窗體的設計每個窗體對應一個庫單元是應用程序的模塊窗體在磁盤上的存儲就是DFM文件

  DFM文件結構我們前面介紹過了它實際上是存儲窗體及其擁有的所有部件的屬性這種擁有關系是遞歸的問題在於如何將這些屬性數據與程序中的變量(屬性)代碼聯系起來

  在Delphi中處理這種聯系的過程分為兩種情況設計時和運行時

  在設計時建立聯系表現為讀取DFM 文件建立DFM文件中的部件及其屬性與可視化設計工具(Object Inspector窗體設計窗口和代碼編輯器)的聯系也就是說讓這些部件及其屬性能出現在這些窗口中並與代碼中的屬性定義聯系起來分解聯系表現為存儲DFM文件將窗體窗口中的部件及其屬性寫入DFM文件

  在運行時主要是建立聯系的過程即讀取DFM文件這時DFM文件不是作為獨立的磁盤文件而是以應用程序資源中的RCDATA類型的二進制數據存在建立聯系的過程表現為將資源中的部件及其屬性與應用程序中的對象及其數據域聯系起來其過程為根據DFM中的部件類名創建對象再將用DFM中的部件屬性值給程序中的部件屬性賦值當然要完成這一過程還必須在代碼中有相應的窗體定義因為方法等代碼是不存入部件的

  VCL對讀取DFM文件在代碼上的支持是通過Stream對象和Filer對象達到的 節中我們可以看到Stream對象和Filer對象中有大量的用於存取部件及其屬性的方法尤其在TReader對象中還有關於錯誤處理和動態的方法賦值的方法下面我們就通過程序實例介紹存取DFM文件方法步驟和注意事項

  返回目錄DELPHI基礎教程

       編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南

  Java程序性能優化讓你的Java程序更快更穩定

  C嵌入式編程設計模式

  Android游戲開發實踐指南

[]  []  []  []  


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