其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[1]


发布日期:2020年11月24日
 
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对象又称流式对象是TStreamTHandleStreamTFileStreamTMemoryStreamTResourceStream和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对象都要根据自己特有的有关特定存储媒介的读操作覆盖该方法而且流的所有其它的读数据的方法(如ReadBufferReadComponent等)在完成实际的读操作时都调用了Read方法面向对象的动态联编的优点就体现在这儿因为后继Stream对象只需覆盖Read方法而其它读操作(如ReadBufferReadComponent等)都不需要重新定义而且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为nilReadComponent的方法基于流中描述的部件类型信息创建部件并返回新创建的部件

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对象都要通过覆盖该方法来提供向特定存储媒介(内存磁盘文件等)写数据的特定方法流的其它所有写数据的方法(如WriteBufferWriteComponent)都调用Write担当实际的写操作

WriteBuffer方法

声明

procedure WriteBuffer(const Buffer; Count: Longint)

WriteBuffer的功能与Write相似WriteBuffer方法调用Write来执行实际的写操作如果流没能写所有字节WriteBuffer会触发一个EWriteError异常事件

WriteComponent方法

在Stream对象和Filer对象都有被称为WriteComponent的方法Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中

[] [] [] [] []

               

上一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(一)[2]

下一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]