7. SetName方法和OnSetName事件
因為在OnSetName事件中,Name參數是var型的,所以可以用OnSetName事件處理過程修改所讀部件的名字。而OnSetName事件處理過程是在SetName方法中實現的。
procedure TReader.SetName(Component: TComponent; var Name: string);
begin
if Assigned(FOnSetName) then FOnSetName(Self, Component, Name);
Component.Name := Name;
end;
SetName方法和OnSetName事件在動態DFM文件的編程中有很重要的作用。
8. TReader的錯誤處理
TReader的錯誤處理是由Error方法和OnError事件的配合使用完成的。OnError 事件處理過程的Handled參數是var型的布爾變量,通過將Handled設為True或False可影響TReader 的錯誤處理。OnError事件處理過程是在Error方法中調用的。
function TReader.Error(const Message: string): Boolean;
begin
Result := False;
if Assigned(FOnError) then FOnError(Self, Message, Result);
end;
9. FindMethod和OnFindMethod事件
有時,在程序運行期間,給部件的方法指針(主要是事件處理過程)動態賦值是很有用的,這樣就能動態地改變部件響應事件的方式。在流中讀取部件捍做到一點就要利用OnFindMehtod事件。OnFIndMethod事件是在FindMethod方法中被調用的。
function TReader.FindMethod(Root: TComponent;
const MethodName: string): Pointer;
var
Error: Boolean;
begin
Result := Root.MethodAddress(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的編程中有很重要的作用。
20.3 Delphi對象式數據管理應用實例
Delphi 2.0無論是其可視化設計工具,還是可視化部件類庫(VCL),都處處滲透了對象存儲技術,本節將從Delphi可視化設計內部機制、VCL中的數據存儲、BLOB數據操作和動態生成部件的存儲幾方面介紹對象存儲功能的實例應用。
20.3.1 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對象達到的。在20. 1和20.1節中,我們可以看到Stream對象和Filer對象中有大量的用於存取部件及其屬性的方法,尤其在TReader對象中,還有關於錯誤處理和動態的方法賦值的方法。下面我們就通過程序實例介紹存取DFM文件方法、步驟和注意事項。