【正文】
Read 方法讀取數(shù)據(jù);否則觸發(fā)一個異常事件,下面看 Integer 類型的讀方法: function : Longint。 Result := S。 end。 end。 begin Result := ReadValue = vaTrue。 var L: Integer。 else PropValueError。 end。 begin if ReadValue = vaExtended then Read(Result, SizeOf(Result)) else begin Dec(FBufPos)。 字符類型數(shù)據(jù)設(shè)有直接的標 志,它是根據(jù) VaString 后面放一個序值為 1 的字節(jié)來判斷的。 if Ord(Result) 1 then begin Dec(FBufPos)。 Read(Result, 1)。 var L: Byte。 end。True39。 end。例如,讀取字符串類型的數(shù)據(jù)時,如果采用傳流方法還要判斷字符串的長度,使用 ReadString 方法就不同了。 ReadSignature 方法主要用于讀取 Delphi Filer 對象標簽一般在讀取部件前,都要用調(diào)用 ReadSignature 方法以指導部件讀寫過程。 if Signature Longint(FilerSignature) then ReadError(SInvalidImage)。 procedure (var Flags: TFilerFlags。 if Byte(NextValue) and $F0 = $F0 then begin Prefix := Byte(ReadValue)。 end。如果 ffChildPos 置位,則緊接著的整型數(shù)字中放著部件在窗體中的位置序值。 function (Component: TComponent): TComponent。 ? begin ReadPrefix(Flags, Position)。 if Result = nil then if ffInherited in Flags then FindExistingComponent else CreateComponent。 Include(, csReading)。 (Result)。 end。 ReadComponent 方法主要是調(diào)用 ReadComponent 方法從 Reader 對象的流中讀取一連串相關(guān)聯(lián)的部件,并分解相互引用關(guān)系。 begin Root := AOwner。 try while not EndOfList do begin ReadSignature。 FixupReferences。 ReadComponents首先用 AOwner和 AParent參數(shù)給 Root,Owner和 Parent賦值,用于重建各部件的相互引用。如果 Component 參數(shù)為 nil,則創(chuàng)建一個相同類型的部件,最后返回該部件: function (Root: TComponent): TComponent。 Flags: TFilerFlags。 if Root = nil then begin Result := TComponentClass(FindClass(ReadStr)).Create(nil)。 { Ignore class name } if csDesigning in then ReadStr else := FindUniqueName(ReadStr)。 try (FRoot)。 (Self)。 FLoaded := nil。39。 end。如果 Root 參數(shù) 為 nil,則用 ReadStr 讀出的類名創(chuàng)建新部件,并以流中讀出部件的 Name 屬性;否則,忽略類名,并判斷 Name 屬性的唯一性。 procedure (Component: TComponent。 end。 OnError 事件處理過程是在Error 方法中調(diào)用的。 end。 function (Root: TComponent。 Error := Result = nil。 OnFindMethod 方法除了可以給部件的 MethodName 所指定的方法指針動態(tài)賦值外,還可修改 Error 參數(shù)來決定是否處理 Missing Method 錯 誤。 Delphi 動態(tài) DFM 文件及部件的存取在超媒體系統(tǒng)中的應用 Delphi 的可視化設(shè)計工具是同其部件類庫緊密結(jié)合在一起的。因為 Delphi 可視化設(shè)計的核心是窗體的設(shè)計。這種擁有關(guān)系是遞歸的。 在運行時,主要是建立聯(lián)系的過程,即讀取 DFM 文件。當然要完成這一過程,還必須在代碼中有相應的窗體定義,因為方法等代碼是不存入部件的。 。在 20. 1 和 節(jié)中,我們可以看到 Stream 對象和 Filer 對象中有大量的用于存取部件及其屬性的方法,尤其在 TReader 對象中,還有關(guān)于錯誤處理和動態(tài)的方法賦值的方法。建立聯(lián)系的過程表現(xiàn)為將資源中的部件及其屬性與應用程序中的對象及其數(shù)據(jù)域聯(lián)系起來。 在 Delphi 中處理這種聯(lián)系的過程分為兩種情況:設(shè)計時和運行時。 DFM 文件結(jié)構(gòu)我們前面介紹過了。因為這種渾然天成的關(guān)系, DFM 文件存取必然得到 VCL 在程序上的支持。 FindMethod 方法和 OnFindMethod 事件在動態(tài) DFM 的編程中有很重要的作用。 if Error then PropValueError。 var Error: Boolean。在流中讀取部件捍做到一點就要利用 OnFindMehtod 事件。 begin Result := False。 8. TReader 的錯誤處理 TReader 的錯誤處理是由 Error 方法和 OnError 事件的配合使用完成的。 begin if Assigned(FOnSetName) then FOnSetName(Self, Component, Name)。 7. SetName 方法和 OnSetName 事件 因為在 OnSetName 事件中, Name 參數(shù)是 var 型的,所以可以用OnSetName 事件處理過程修改所讀部件的名字。 ReadRootComponent 首先調(diào)用 ReadSignature 讀取 Filer 對象標簽。 if Root = nil then 。 GlobalFixupReferences。 if GlobalLoaded = nil then for I := 0 to 1 do TComponent(FLoaded[I]).Loaded。 Include(, csLoading)。 FRoot := Result。 end else begin Result := Root。 Result := nil。 begin ? end。在重建引用關(guān)系時,用了 BeginReferences 、FixUpReferences 和 EndReferences 嵌套模式。 end。 Proc(Component)。 Parent := AParent。 Proc: TReadComponentsProc)。然后用 ReadStr 方法分別讀出部件類名和部件名。 raise。 Exclude(, csReading)。 if not (ffInherited in Flags) then SetCompName。 CompName := ReadStr。 Flags: TFilerFlags。 Component 參數(shù)指定了要從流中讀取的對象。 TFilerFlags = Set of TFilerFlag。 if ffChildPos in Flags then AChildPos := ReadInteger。 var Prefix: