TReader对象
TReader对象是可实例化的用于从相联系的流中读取数据的Filer对象TReader对象从TFiler继承下来除了从TFiler继承的属性和方法外TReader声明了不少属性方法和事件
Owner和Parent属性用于表示从Reader对象的流中读取的部件的拥有者和双亲结点OnErrorOnFindMethod和OnSetName事件使应用程序在运行中读数据时能定制响应方式除了覆盖了一些从TFiler对象中继承的方法外TReader对象还定义大量的读不同类型的数据和触发事件的方法
TReader对象的属性和方法
Owner属性
声明
property Owner: TComponent;
Reader对象的Owner属性存储了将用来给从Reader的流中读出的部件的Owner属性赋值的部件
Parent属性
声明
property Parent: TComponent;
Parent属性存储将用来给从Reader的流中读出所有控制的Parent属性赋值的部件
Position属性
声明
propertion: Longint;
Reader对象的Position属性表示相联的流中读的当前位置Position的值还应包括读缓沖区的大小对于Reader 对象Position的值大于流的Position 的值如果将Position的值设得超过当前缓沖区将引起调用FlushBuffer
BeginReferences方法
声明
procedure BeginReferences;
BeginReferences方法启动一连串关于读部件的命令这些部件包含相互间的交叉引用在使用上通常和FixupReferences和EndReferences一起放在Try…finally程序块中
在调用了BeginReferences后Reader对象创建读取所有对象和名字的列表所有的独立对象被读出后调用FixupReferences方法将名字的相互从流中转移到对象实例中最后调用EndReferences方法释放列表
处理部件相互引用的程序块形式如下
BeginReferences; { 创建临时列表 }
try
{ 读出所有部件并将它们的名字放在一临时列表中 }
…
FixupReferences; { 分 解 }
finally
EndReferences; { 释放临时列表 }
end;
FixUpReferences方法
声明
procedure FixupReferences;
FixupReferences方法分解从流中读出的存在各种相互依赖部件的引用关系FixupReferences总在try…finally块中并配合BeginReferences和EndReferences一起使用
EndReferences方法
声明
procedure EndReferences;
EndReferences方法终止处理相互引用的块操作释放对象列表它总配合BeginReferences和FixupReferences一起使用
ReadListBegin方法
声明
procedure ReadListBegin;
ReadListBegin方法从Reader对象相联的流中读取列表开始标志如果流中紧接着要读取的项目不是一个由WritelistBegin方法写入的列表起始标志ReadListBegin将引起一个读异常事件
通常在调用ReadlistBegin方法之后紧跟着一个读项目的循环循环以EndfList方法返回True 终止条件这时预示流中的下一个项目是列表结束标志需要调用ReadListEnd方法
ReadListEnd方法
声明
procedure ReadListEnd;
ReadListEnd 方法从流中读取列表结束标志如果所读的项目不是一个列表结束标志ReadListEnd方法引发一个EReadError异常事件
EndOfList方法
声明
function EndOfList: Boolean;
如果Reader对象读到项目列表结果标志EndOfList方法返回True
TStrings对象在从Reader对象读取项目列表时使用了ReadListBegin和ReadListEnd方法下面的ReadData是TStrings的方法用于在DefineProperties方面中读string数据
procedure TStringsReadData(Reader: TReader)
begin
ReaderReadListBegin; { 读列表开始标志 }
Clear; { 清除已有的字符串 }
while not ReaderEndOfList do { 只要还有数据 … }
Add(ReaderReadString) { …读一个字符串并将其加在列表中 }
ReaderReadListEnd; { 越过列表结束标志 }
end;
ReadSignature方法
声明
procedure ReadSignature;
ReadSignature方法从流中读取部件之前首先调用ReadSignature方法在载入对象之前检测标签Reader对象就能防止疏忽大意导致读取无效或过时的数据Filer标签是四个字符对于Delphi 该标签是TPF
ReadPrefix方法
声明
procedure ReadPrefix(var Plags: TFilerFlags; var AChild
Pos: Integer)
ReadPrefix方法的功能与ReadSignature的很相象只不过它是读取流中部件前面的标志(PreFix)当一个Write对象将部件写入流中时它在部件前面预写了两个值第一个值是指明部件是否是从祖先窗体中继承的窗体和它在窗体中的位置是否重要的标志第二个值指明它在祖先窗体创建次序ReadComponent方法自动调用ReadPrefix但如果需要独立读取部件的预读标志也可直接调用该方向
OnFindMethod事件
声明
property OnFindMethod: TFindMethodEvent;
OnFindMethod事件发生在Reader对象读取对象的方法指针时属性为方法指针的通常都是事件
响应OnFindMethod事件的理由通常是处理过程找不到方法的情况在FindMethod方法没有找到由Name指定的方法的情况下如果它将OnFindMethod方法的Error 参数设为True将引起ReadError异常事件反之将Error参数置为False将防止FindMethod方法引发异常事件
Error方法
声明
function Error(const Message: String)
Boolean; virtual;
Error方法定义在Reader对象的protected部分它是用于Reader对象的OnError事件其返回值决定是否继续错误处理过程如果返回值为True则表示用程序应当继续错误处理如果返回值为False则表示错误情况被忽略
如果读部件或属性出错Reader对象调用Error方法缺省情况下Error将返回值设为False然后调用OnError事件处理过程
TReader对象总是在try…except程序块的except部分并提供用户忽略错误的机会Error的使用方法如下
try
… { 读部件 }
except
on E: Exception do
begin
…{ 执行一些清除操作 }
if Error(EMessage) then raise;
end;
end;
OnError事件
声明
property OnError: TReaderError;
当Reader对象读取数据出错时将引发OnError事件通过处理OnError事件可以有选择地处理或忽略错误
传给OnError事件处理过程的最后一个参数是名为Handled的var参数在缺省情况下Error方法将Handled置为True这将阻止错误更进一步处理如果事件处理过程仍旧将Handled置为FalseReader对象将引发一个EReadError异常事件
SetName方法
声明
procedure SetName(Component: TComponent; var Name: String virtual)
SetName方法允许Reader对象在将从流中读取的部件的Name值赋给部件的Name属性前修改Name值ReadComponent方法在读取部件的属性值和其它数据前先读部件的类型和名字在读完名字后ReadComponent将所读的名字作为Name参数传给SetNameName 是个var参数因此SetName能在返回前修改字符串值SetName还调用了OnSetName事件处理过程将名字字符串作为var参数传入事件处理过程中因此事件处理过程也可修改字符串的值
[] [] [] []