delphi入门第二十章开发delphi对象式数据管理功能

上传人:shaoy****1971 文档编号:108245326 上传时间:2019-10-23 格式:DOC 页数:208 大小:253KB
返回 下载 相关 举报
delphi入门第二十章开发delphi对象式数据管理功能_第1页
第1页 / 共208页
delphi入门第二十章开发delphi对象式数据管理功能_第2页
第2页 / 共208页
delphi入门第二十章开发delphi对象式数据管理功能_第3页
第3页 / 共208页
delphi入门第二十章开发delphi对象式数据管理功能_第4页
第4页 / 共208页
delphi入门第二十章开发delphi对象式数据管理功能_第5页
第5页 / 共208页
点击查看更多>>
资源描述

《delphi入门第二十章开发delphi对象式数据管理功能》由会员分享,可在线阅读,更多相关《delphi入门第二十章开发delphi对象式数据管理功能(208页珍藏版)》请在金锄头文库上搜索。

1、第二十章开发Delphi对象式数据管理功能面向对象技术是九十年代的主流技术,各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质。在面向对象程序设计中,对象式数据管理占有很重要的地位。在Delphi中,对对象式数据管理的支持方式是其一大特色。Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境。Delphi的核心是部件。部件是对象的一种。Delphi应用程序完全是由部件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术。对象式数据管理包括两方面的内容: 用对象来管理数据 对各类数据对象(包括对象和部件)的管理Delphi

2、在这两方面都做的相当出色。在Delphi的早期版本Turbo Pascal 中就曾有流(Stream)、群(Collection)和资源(Resource)等专门用于对象式数据管理的类。在Delphi中,这些功能得到了大大的加强。Delphi将对象式数据管理类归结为Stream对象(Stream)和Filer对象(Filer),并将它们应用于可视部件类库(VCL)的方方面面。它们不仅提供了在内存、外存和Windows资源中管理对象的功能,还提供了在数据库BLOB字段中对象的功能。在本章中将介绍Stream对象和Filer对象的实现原理、应用方法以及在超媒体系统中的应用。这对于运用Delphi

3、开发高级应用是很重要的。20.1 流式对象的实现原理和应用Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件) 在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序可以相当容易地在各种Stream对象中拷贝数据。下面介绍各种对象的数据和方法及使用方法。20.1.1 TStream对象TStream对象是能在各种媒介中存储二进制数据的对象

4、的抽象对象。从TStream 对象继承的对象用于在内存、Windows资源文件、磁盘文件和数据库字段等媒介中存储数据。TStream中定义了两个属性:Size和Position。它们分别以字节为单位表示的流的大小和当前指针位置。TStream中定义的方法用于在各种流中读、写和相互拷贝二进制数据。因为所有的Stream对象都是从TStream中继承来的,所以在TStream中定义的域和方法都能被Stream对象调用和访问。此外,又由于面向对象技术的动态联编功能,TStream为各种流的应用提供了统一的接口,简化了流的使用;不同Stream对象是抽象了对不同存储媒介的数据上的操作,因此,TStre

5、am的需方法为在不同媒介间的数据拷贝提供了最简捷的手段。20.1.1.1 TStream的属性和方法1. Position属性声明:property Position: Longint; Position属性指明流中读写的当前偏移量。2. Size属性声明:property Size: Longint; Size属性指明了以字节为单位的流的的大小,它是只读的。3. CopyFrom方法声明:function CopyFrom(Source: TStream; Count: Longint): Longint; CopyFrom从Source所指定的流中拷贝Count个字节到当前流中, 并将指针

6、从当前位置移动Count个字节数,函数返回值是实际拷贝的字节数。4. Read方法声明:function Read(var Buffer; Count: Longint): Longint; virtual; abstract; Read方法从当前流中的当前位置起将Count个字节的内容复制到Buffer中,并把当前指针向后移动Count个字节数,函数返回值是实际读的字节数。如果返回值小于Count,这意味着读操作在读满所需字节数前指针已经到达了流的尾部。Read方法是抽象方法。每个后继Stream对象都要根据自己特有的有关特定存储媒介的读操作覆盖该方法。而且流的所有其它的读数据的方法(如:R

7、eadBuffer,ReadComponent等)在完成实际的读操作时都调用了Read方法。面向对象的动态联编的优点就体现在这儿。因为后继Stream对象只需覆盖Read方法,而其它读操作(如ReadBuffer、ReadComponent等)都不需要重新定义,而且TStream还提供了统一的接口。5. ReadBuffer方法声明:procedure ReadBuffer(var Buffer; Count: Longint); ReadBuffer方法从流中将Count个字节复制到Buffer 中, 并将流的当前指针向后移动Count个字节。如读操作超过流的尾部,ReadBuffer方法引

8、起EReadError异常事件。6. ReadComponent方法 声明:function ReadComponent(Instance: TComponent): TComponent; ReadComponent方法从当前流中读取由Instance所指定的部件,函数返回所读的部件。ReadComponent在读Instance及其拥有的所有对象时创建了一个Reader对象并调用它的ReadRootComponent方法。如果Instance为nil,ReadComponent的方法基于流中描述的部件类型信息创建部件,并返回新创建的部件。7. ReadComponentRes方法声明:fu

9、nction ReadComponentRes(Instance: TComponent): TComponent; ReadComponentRes方法从流中读取Instance指定的部件,但是流的当前位置必须是由WriteComponentRes方法所写入的部件的位置。ReadComponentRes 首先调用ReadResHeader方法从流中读取资源头,然后调用ReadComponent方法读取Instance。如果流的当前位置不包含一个资源头。ReadResHeader将引发一个EInvalidImage异常事件。在Classes库单元中也包含一个名为ReadComponentRes

10、的函数,该函数执行相同的操作,只不过它基于应用程序包含的资源建立自己的流。8. ReadResHeader方法声明:procedure ReadResHeader; ReadResHeader方法从流的当前位置读取Windows资源文件头,并将流的当前位置指针移到该文件头的尾部。如果流不包含一个有效的资源文件头,ReadResHeader将引发一个EInvalidImage异常事件。流的ReadComponentRes方法在从资源文件中读取部件之前,会自动调用ReadResHeader方法,因此,通常程序员通常不需要自己调用它。9. Seek方法声明:function Seek(Offset:

11、 Longint; Origin: Word): Longint; virtual; abstract; Seek方法将流的当前指针移动Offset个字节,字节移动的起点由Origin指定。如果Offset是负数,Seek方法将从所描述的起点往流的头部移动。下表中列出了Origin的不同取值和它们的含义:表20.1 函数Seek的参数的取值常量值 Seek的起点 Offset的取值SoFromBeginning 0 流的开头 正 数SoFromCurrent 1 流的当前位置 正数或负数 SoFromEnd 2 流的结尾 负 数 10. Write方法在Delphi对象式管理的对象中有两类对象

12、的方法都有称为Write的:Stream对象和Filer对象。Stream对象的Write方法将数据写进流中。Filer对象通过相关的流传递数据,在后文中会介绍这类方法。Stream对象的Write方法声明如下:function Write(const Buffer; Count: Longint): Longint; virtual; abstract; Write方法将Buffer中的Count个字节写入流中,并将当前位置指针向流的尾部移动Count个字节,函数返回写入的字节数。 TStream的Write方法是抽象的,每个继承的Stream对象都要通过覆盖该方法来提供向特定存储媒介(内存

13、、磁盘文件等)写数据的特定方法。流的其它所有写数据的方法(如WriteBuffer、WriteComponent)都调用Write担当实际的写操作。11. WriteBuffer方法声明:procedure WriteBuffer(const Buffer; Count: Longint); WriteBuffer的功能与Write相似。WriteBuffer方法调用Write来执行实际的写操作,如果流没能写所有字节,WriteBuffer会触发一个EWriteError异常事件。12. WriteComponent方法在Stream对象和Filer对象都有被称为WriteComponent的

14、方法。Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中;Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中。Stream对象的WriteComponent方法声明是这样的:procedure WriteComponent(Instance: Tcomponent); WriteComponent创建一个Writer对象,并调用Writer的WriteRootComponent方法将Instance及其拥有的对象写入流。13. WriteComponentRes方法声明:WriteCompone

15、ntRes(const ResName: String; Instance: TComponent); WriteComponentRes方法首先往流中写入标准Windows 资源文件头,然后将Instance指定的部件写入流中。要读由WriteComponentRes写入的部件,必须调用ReadComponentRes方法。WriteComponentRes使用ResName传入的字符串作为资源文件头的资源名,然后调用WriteComponent方法将Instance和它拥有的部件写入流。14. WriteDescendant方法声明:procedure WriteDescendant(Instance Ancestor: TComponent); Stream对象的WriteDescendant方法创建一个Writer对象,然后调入该对象的WriteDescendant方法将Instanc

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号