您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 第二十章 开发Delphi对象式数据管理功能(四)
20.2.3TReader对象TReader对象是可实例化的用于从相联系的流中读取数据的Filer对象。TReader对象从TFiler继承下来,除了从TFiler继承的属性和方法外,TReader声明了不少属性、方法和事件。Owner和Parent属性用于表示从Reader对象的流中读取的部件的拥有者和双亲结点。OnError,OnFindMethod和OnSetName事件使应用程序在运行中读数据时能定制响应方式。除了覆盖了一些从TFiler对象中继承的方法外,TReader对象还定义大量的读不同类型的数据和触发事件的方法。20.2.3.1TReader对象的属性和方法1.Owner属性声明:propertyOwner:TComponent;Reader对象的Owner属性存储了将用来给从Reader的流中读出的部件的Owner属性赋值的部件。2.Parent属性声明:propertyParent:TComponent;Parent属性存储将用来给从Reader的流中读出所有控制的Parent属性赋值的部件。3.Position属性声明:propertion:Longint;Reader对象的Position属性表示相联的流中读的当前位置。Position的值还应包括读缓冲区的大小。对于Reader对象,Position的值大于流的Position的值。如果将Position的值设得超过当前缓冲区,将引起调用FlushBuffer。4.BeginReferences方法声明:procedureBeginReferences;BeginReferences方法启动一连串关于读部件的命令,这些部件包含相互间的交叉引用。在使用上通常和FixupReferences和EndReferences一起放在Try…finally程序块中。在调用了BeginReferences后,Reader对象创建读取所有对象和名字的列表。所有的独立对象被读出后,调用FixupReferences方法将名字的相互从流中转移到对象实例中。最后调用EndReferences方法释放列表。处理部件相互引用的程序块形式如下:BeginReferences;{创建临时列表}try{读出所有部件并将它们的名字放在一临时列表中}…FixupReferences;{分解}finallyEndReferences;{释放临时列表}end;5.FixUpReferences方法声明:procedureFixupReferences;FixupReferences方法分解从流中读出的存在各种相互依赖部件的引用关系。FixupReferences总在try…finally块中并配合BeginReferences和EndReferences一起使用。6.EndReferences方法声明:procedureEndReferences;EndReferences方法终止处理相互引用的块操作,释放对象列表。它总配合BeginReferences和FixupReferences一起使用。7.ReadListBegin方法声明:procedureReadListBegin;ReadListBegin方法从Reader对象相联的流中读取列表开始标志。如果流中紧接着要读取的项目不是一个由WritelistBegin方法写入的列表起始标志,ReadListBegin将引起一个读异常事件。通常在调用ReadlistBegin方法之后,紧跟着一个读项目的循环,循环以EndfList方法返回True终止条件。这时,预示流中的下一个项目是列表结束标志,需要调用ReadListEnd方法。8.ReadListEnd方法声明:procedureReadListEnd;ReadListEnd方法从流中读取列表结束标志。如果所读的项目不是一个列表结束标志,ReadListEnd方法引发一个EReadError异常事件。9.EndOfList方法声明:functionEndOfList:Boolean;如果Reader对象读到项目列表结果标志,EndOfList方法返回True。TStrings对象在从Reader对象读取项目列表时使用了ReadListBegin和ReadListEnd方法。下面的ReadData是TStrings的方法,用于在DefineProperties方面中读string数据。procedureTStrings.ReadData(Reader:TReader);beginReader.ReadListBegin;{读列表开始标志}Clear;{清除已有的字符串}whilenotReader.EndOfListdo{只要还有数据…}Add(Reader.ReadString);{…读一个字符串并将其加在列表中}Reader.ReadListEnd;{越过列表结束标志}end;10.ReadSignature方法声明:procedureReadSignature;ReadSignature方法从流中读取部件之前首先调用ReadSignature方法。在载入对象之前检测标签。Reader对象就能防止疏忽大意,导致读取无效或过时的数据。Filer标签是四个字符,对于Delphi2.0,该标签是“TPF0”。11.ReadPrefix方法声明:procedureReadPrefix(varPlags:TFilerFlags;varAChild,Pos:Integer);ReadPrefix方法的功能与ReadSignature的很相象,只不过它是读取流中部件前面的标志(PreFix)。当一个Write对象将部件写入流中时,它在部件前面预写了两个值,第一个值是指明部件是否是从祖先窗体中继承的窗体和它在窗体中的位置是否重要的标志;第二个值指明它在祖先窗体创建次序。ReadComponent方法自动调用ReadPrefix。但如果需要独立读取部件的预读标志,也可直接调用该方向。12.OnFindMethod事件声明:propertyOnFindMethod:TFindMethodEvent;OnFindMethod事件,发生在Reader对象读取对象的方法指针时,属性为方法指针的通常都是事件。响应OnFindMethod事件的理由,通常是处理过程找不到方法的情况。在FindMethod方法没有找到由Name指定的方法的情况下,如果它将OnFindMethod方法的Error参数设为True,将引起ReadError异常事件;反之,将Error参数置为False,将防止FindMethod方法引发异常事件。13.Error方法声明:functionError(constMessage:String):Boolean;virtual;Error方法定义在Reader对象的protected部分,它是用于Reader对象的OnError事件。其返回值决定是否继续错误处理过程。如果返回值为True,则表示用程序应当继续错误处理;如果返回值为False,则表示错误情况被忽略。如果读部件或属性出错。Reader对象调用Error方法。缺省情况下,Error将返回值设为False,然后调用OnError事件处理过程。TReader对象总是在try…except程序块的except部分,并提供用户忽略错误的机会。Error的使用方法如下:try…{读部件}exceptonE:Exceptiondobegin…{执行一些清除操作}ifError(E.Message)thenraise;end;end;14.OnError事件声明:propertyOnError:TReaderError;当Reader对象读取数据出错时将引发OnError事件。通过处理OnError事件,可以有选择地处理或忽略错误。传给OnError事件处理过程的最后一个参数是名为Handled的var参数。在缺省情况下,Error方法将Handled置为True。这将阻止错误更进一步处理。如果事件处理过程仍旧将Handled置为False,Reader对象将引发一个EReadError异常事件。15.SetName方法声明:procedureSetName(Component:TComponent;varName:Stringvirtual);SetName方法允许Reader对象在将从流中读取的部件的Name值赋给部件的Name属性前修改Name值。ReadComponent方法在读取部件的属性值和其它数据前先读部件的类型和名字在读完名字后,ReadComponent将所读的名字作为Name参数传给SetName,Name是个var参数,因此SetName能在返回前修改字符串值。SetName还调用了OnSetName事件处理过程,将名字字符串作为var参数传入事件处理过程中,因此,事件处理过程也可修改字符串的值。16.OnSetName事件声明:propertyOnSetName:TSetNameEvent;OnSetName事件发生在Read对象设置部件的Name属性前,OnSetName事件处理过程的var参数Name参数是一个var参数,因此,事件处理过程再将Name赋给部件前,可以修改Name的值。这对于想过滤窗体中部件的名字是很有帮助的。下面的OnSetName事件处理过程,命名了名字中包含“Button”的部件,并用“PushButton”替代。procedureTForm1.ReaderSetName(Reader:TReader;Component:TComponent;varName:string);varButtonPos:Integer;beginButtonPos:=Pos('Button',Name);ifButtonPos0thenName:=Copy(Name,1,ButtonPos-1)+'PushButton'+Copy(Name,ButtonPos+6,Length(Name));end;17.ReadValue方法声明:functionReadValue:TValueType;ReadValue方法读取流中紧着的项目的类型,函数返回后,流的指针移到值类型指示符之后。TValueType是枚举类型。存储在Filer对象的流中的每个项目之前都有一个字节标识该项目的类型,在读每个项目之前都要读取该字节,以指导调用哪个方法来闱取项目。该字节的值就TValuetype定义的值类型之一。18.NextValue方法声明:functionNextvalue:TValuetype;Nextvalue方法的作用也是返回Reader对象流中紧接着的项目的类型,它与ReadValue的区别在于并不移动指针位置。19.ReadBoolean方法声明:functionReadBoolean:Boolean;ReadBoolean方法从Reader对象的流中读取一个布尔值,并相应地移动流位置指针。20、ReadChar方法声明:functionReadChar:char;ReadChar方法从Reader对象的流中读取一个字符。21.ReadFloat方法声明:functionReadFloat:Extended;ReadFloat方法从流中读取浮点数。20.ReadIdent方法声明:functionReadIdent:string;ReadIdent方法从流中读取标识符。23.ReadInteger方法声明:functionReadInteger:LonginReadInteger方法从流中读取整型数字。24.ReadString方法声明:functionReadString:string;ReadString方法从Reader对象的流中读取一个字符串,并返回字符串中的内容。该字符串是由Writer对象的WriteString方法写入。20.2.3.2TReader对象的实现Filer对象的作用主要是Delp
本文标题:第二十章 开发Delphi对象式数据管理功能(四)
链接地址:https://www.777doc.com/doc-3241482 .html