DELPHI基础教程:开发Delphi对象式数据管理功能(一)[1]
面向对象技术是九十年代的主流技术 各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质 在面向对象程序设计中 对象式数据管理占有很重要的地位 在Delphi中 对对象式数据管理的支持方式是其一大特色
Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境 Delphi的核心是部件 部件是对象的一种 Delphi应用程序完全是由部件来构造的 因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术
对象式数据管理包括两方面的内容
● 用对象来管理数据
● 对各类数据对象(包括对象和部件)的管理
Delphi在这两方面都做的相当出色 在Delphi的早期版本Turbo Pascal 中就曾有流(Stream) 群(Collection)和资源(Resource)等专门用于对象式数据管理的类 在Delphi中 这些功能得到了大大的加强 Delphi将对象式数据管理类归结为Stream对象(Stream)和Filer对象(Filer) 并将它们应用于可视部件类库(VCL)的方方面面 它们不仅提供了在内存 外存和Windows资源中管理对象的功能 还提供了在数据库BLOB字段中对象的功能
在本章中将介绍Stream对象和Filer对象的实现原理 应用方法以及在超媒体系统中的应用 这对于运用Delphi 开发高级应用是很重要的
流式对象的实现原理和应用
Stream对象 又称流式对象 是TStream THandleStream TFileStream TMemoryStream TResourceStream和TBlobStream等的统称 它们分别代表了在各种媒介上存储数据的能力 它们将各种数据类型(包括对象和部件) 在内存 外存和数据库字段中的管理操作抽象为对象方法 并且充分利用了面向对象技术的优点 应用程序可以相当容易地在各种Stream对象中拷贝数据
下面介绍各种对象的数据和方法及使用方法
TStream对象
TStream对象是能在各种媒介中存储二进制数据的对象的抽象对象 从TStream 对象继承的对象用于在内存 Windows资源文件 磁盘文件和数据库字段等媒介中存储数据
TStream中定义了两个属性 Size和Position 它们分别以字节为单位表示的流的大小和当前指针位置 TStream中定义的方法用于在各种流中读 写和相互拷贝二进制数据 因为所有的Stream对象都是从TStream中继承来的 所以在TStream中定义的域和方法都能被Stream对象调用和访问 此外 又由于面向对象技术的动态联编功能 TStream为各种流的应用提供了统一的接口 简化了流的使用 不同Stream对象是抽象了对不同存储媒介的数据上的操作 因此 TStream的需方法为在不同媒介间的数据拷贝提供了最简捷的手段
TStream的属性和方法
Position属性
声明
property Position: Longint;Position属性指明流中读写的当前偏移量
Size属性
声明
property Size: Longint;Size属性指明了以字节为单位的流的的大小 它是只读的
CopyFrom方法
声明
function CopyFrom(Source: TStream; Count: Longint) Longint;CopyFrom从Source所指定的流中拷贝Count个字节到当前流中 并将指针从当前位置移动Count个字节数 函数返回值是实际拷贝的字节数
Read方法
声明
function Read(var Buffer; Count: Longint) Longint; virtual; abstract;Read方法从当前流中的当前位置起将Count个字节的内容复制到Buffer中 并把当前指针向后移动Count个字节数 函数返回值是实际读的字节数 如果返回值小于Count 这意味着读操作在读满所需字节数前指针已经到达了流的尾部
Read方法是抽象方法 每个后继Stream对象都要根据自己特有的有关特定存储媒介的读操作覆盖该方法 而且流的所有其它的读数据的方法(如 ReadBuffer ReadComponent等)在完成实际的读操作时都调用了Read方法 面向对象的动态联编的优点就体现在这儿 因为后继Stream对象只需覆盖Read方法 而其它读操作(如ReadBuffer ReadComponent等)都不需要重新定义 而且TStream还提供了统一的接口
ReadBuffer方法
声明
procedure ReadBuffer(var Buffer; Count: Longint)ReadBuffer方法从流中将Count个字节复制到Buffer 中 并将流的当前指针向后移动Count个字节 如读操作超过流的尾部 ReadBuffer方法引起EReadError异常事件
ReadComponent方法
声明
function ReadComponent(Instance: TComponent) TComponent;ReadComponent方法从当前流中读取由Instance所指定的部件 函数返回所读的部件 ReadComponent在读Instance及其拥有的所有对象时创建了一个Reader对象并调用它的ReadRootComponent方法
如果Instance为nil ReadComponent的方法基于流中描述的部件类型信息创建部件 并返回新创建的部件
ReadComponentRes方法
声明
function ReadComponentRes(Instance: TComponent) TComponent;ReadComponentRes方法从流中读取Instance指定的部件 但是流的当前位置必须是由WriteComponentRes方法所写入的部件的位置
ReadComponentRes 首先调用ReadResHeader方法从流中读取资源头 然后调用ReadComponent方法读取Instance 如果流的当前位置不包含一个资源头 ReadResHeader将引发一个EInvalidImage异常事件 在Classes库单元中也包含一个名为ReadComponentRes的函数 该函数执行相同的操作 只不过它基于应用程序包含的资源建立自己的流
ReadResHeader方法
声明
procedure ReadResHeader;ReadResHeader方法从流的当前位置读取Windows资源文件头 并将流的当前位置指针移到该文件头的尾部 如果流不包含一个有效的资源文件头 ReadResHeader将引发一个EInvalidImage异常事件
流的ReadComponentRes方法在从资源文件中读取部件之前 会自动调用ReadResHeader方法 因此 通常程序员通常不需要自己调用它
Seek方法
声明
function Seek(Offset: Longint; Origin: Word) Longint; virtual; abstract;Seek方法将流的当前指针移动Offset个字节 字节移动的起点由Origin指定 如果Offset是负数 Seek方法将从所描述的起点往流的头部移动 下表中列出了Origin的不同取值和它们的含义
表 函数Seek的参数的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
常量 值 Seek的起点 Offset的取值
─────────────────────────────────
SoFromBeginning 流的开头 正 数
SoFromCurrent 流的当前位置 正数或负数
SoFromEnd 流的结尾 负 数
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Write方法
在Delphi对象式管理的对象中有两类对象的方法都有称为Write的 Stream对象和Filer对象 Stream对象的Write方法将数据写进流中 Filer对象通过相关的流传递数据 在后文中会介绍这类方法
Stream对象的Write方法声明如下
function Write(const Buffer; Count: Longint) Longint; virtual; abstract;
Write方法将Buffer中的Count个字节写入流中 并将当前位置指针向流的尾部移动Count个字节 函数返回写入的字节数
TStream的Write方法是抽象的 每个继承的Stream对象都要通过覆盖该方法来提供向特定存储媒介(内存 磁盘文件等)写数据的特定方法 流的其它所有写数据的方法(如WriteBuffer WriteComponent)都调用Write担当实际的写操作
WriteBuffer方法
声明
procedure WriteBuffer(const Buffer; Count: Longint)WriteBuffer的功能与Write相似 WriteBuffer方法调用Write来执行实际的写操作 如果流没能写所有字节 WriteBuffer会触发一个EWriteError异常事件
WriteComponent方法
在Stream对象和Filer对象都有被称为WriteComponent的方法 Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中 Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中
lishixinzhi/Article/program/Delphi/201311/25104