首页 / 软件开发 / Delphi / 第二十章-开发Delphi对象式数据管理功能(四)(2)
第二十章-开发Delphi对象式数据管理功能(四)(2)2007-05-0714. OnError事件声明:property OnError: TReaderError; 当Reader对象读取数据出错时将引发OnError事件。通过处理OnError事件,可以有选择地处理或忽略错误。传给OnError事件处理过程的最后一个参数是名为Handled的var参数。在缺省情况下,Error方法将Handled置为True。这将阻止错误更进一步处理。如果事件处理过程仍旧将Handled置为False,Reader对象将引发一个EReadError异常事件。15. SetName方法声明:procedure SetName(Component: TComponent; var Name: String virtual); SetName方法允许Reader对象在将从流中读取的部件的Name值赋给部件的Name属性前修改Name值。ReadComponent方法在读取部件的属性值和其它数据前先读部件的类型和名字在读完名字后,ReadComponent将所读的名字作为Name参数传给SetName,Name 是个var参数,因此SetName能在返回前修改字符串值。SetName还调用了OnSetName事件处理过程,将名字字符串作为var参数传入事件处理过程中,因此,事件处理过程也可修改字符串的值。16. OnSetName事件声明:property OnSetName: TSetNameEvent; OnSetName事件发生在Read对象设置部件的Name属性前,OnSetName事件处理过程的var参数Name参数是一个var参数,因此,事件处理过程再将Name赋给部件前,可以修改Name的值。这对于想过滤窗体中部件的名字是很有帮助的。下面的OnSetName事件处理过程,命名了名字中包含“Button”的部件,并用“PushButton”替代。procedure TForm1.ReaderSetName(Reader: TReader; Component: TComponent;var Name: string);varButtonPos: Integer;beginButtonPos := Pos("Button", Name);if ButtonPos <> 0 thenName := Copy(Name, 1, ButtonPos - 1) + "PushButton" +Copy(Name, ButtonPos + 6, Length(Name));end;17. ReadValue方法声明:function ReadValue: TValueType; ReadValue方法读取流中紧着的项目的类型,函数返回后,流的指针移到值类型指示符之后。TValueType是枚举类型。存储在Filer对象的流中的每个项目之前都有一个字节标识该项目的类型,在读每个项目之前都要读取该字节,以指导调用哪个方法来闱取项目。该字节的值就TValuetype定义的值类型之一。18. NextValue方法声明:function Nextvalue: TValuetype; Nextvalue方法的作用也是返回Reader对象流中紧接着的项目的类型,它与ReadValue的区别在于并不移动指针位置。19. ReadBoolean方法声明:function ReadBoolean: Boolean; ReadBoolean方法从Reader对象的流中读取一个布尔值,并相应地移动流位置指针。20、ReadChar方法声明:function ReadChar: char; ReadChar方法从Reader对象的流中读取一个字符。21. ReadFloat方法声明:function ReadFloat: Extended; ReadFloat方法从流中读取浮点数。20. ReadIdent方法声明:function ReadIdent: string; ReadIdent方法从流中读取标识符。23. ReadInteger方法声明:function ReadInteger: LonginReadInteger方法从流中读取整型数字。24.ReadString方法声明:function Read String: string; ReadString方法从Reader对象的流中读取一个字符串,并返回字符串中的内容。该字符串是由Writer对象的WriteString方法写入。20.2.3.2 TReader对象的实现Filer对象的作用主要是Delphi用来在DFM文件中读写各种类型的数据(包括部件对象)。这些数据的一个本质特征是变长,而且Filer对象将读写数据操作抽象化,包装成对象提供了大量的读写方法,方便了程序的调用。因此在应用程序中可以广泛使Filer对象,充分利用Delphi的面向对象技术。而且Filer对象与Stream对象捆绑在一起,一方面可以在各种存储媒介中存取任意格式的数据;另一方面,由于充分利用面向对象的动态联编,各种读写方法的使用方法是一致的,因此,方法调用很简单。下面我们着重介绍Reader 对象中与读写数据操作有关的属性和方法的实现。1. TReader属性的实现在TReader对象的属性实现中我们重点介绍Position的实现。Position属性的定义了使用了读写控制,它们分别是GetPosition和SetPosition方法。TReader = class(TFiler)private…function GetPosition: Longint;procedure SetPosition(Value: Longint);public…property Position: Longint read GetPosition write SetPosition;end;Postition的读写控制方法如下:function TReader.GetPosition: Longint;beginResult := FStream.Position + FBufPos;end;procedure TReader.SetPosition(Value: Longint);beginFStream.Position := Value;FBufPos := 0;FBufEnd := 0;end;在TReader的父对象TFiler对象中介绍过FBufPos和FBufEnd变量。Filer对象内部分配了一个BufSize大小的缓冲区FBufPos就是指在缓冲区中的相对位置,FBufEnd是指在缓冲区中数据结束处的位置(缓冲区中的数据不一定会充满整个缓冲区)。在GetPosition方法中可以看到Reader对象的Position值和Stream对象的Position值是不同的。Reader对象多了一个FButPos的编移量。