当前位置:七道奇文章资讯编程技术Delphi编程
日期:2011-03-20 17:55:00  来源:本站整理

第二十章 开辟Delphi对象式数据管理功效(一)[Delphi编程]

赞助商链接



  本文“第二十章 开辟Delphi对象式数据管理功效(一)[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

  面向对象技术是九十年代的主流技术,各类利用软件假如以面向对象的办法构造并且浸透面向对象的气势将使软件具有更高的品质.在面向对象程序计划中,对象式数据管理占据很重要的地位.在Delphi中,对对象式数据管理的支持方法是其一大特点.

Delphi是一个面向对象的可视化计划与面向对象的语言相结合的集成开辟环境.Delphi的核心是部件.部件是对象的一种.Delphi利用程序美满是由部件来构造的,因此开辟高性能的Delphi利用程序必定会触及对象式数据管理技术.

对象式数据管理包含两方面的内容:

用对象来管理数据

对各类数据对象(包含对象和部件)的管理

 

Delphi在这两方面都做的相当超卓.在Delphi的早期版本Turbo Pascal 中就曾有流(Stream)、群(Collection)和资源(Resource)等专门用于对象式数据管理的类.在Delphi中,这些功效得到了大大的加强.Delphi将对象式数据管理类归结为Stream对象(Stream)Filer对象(Filer),并将它们利用于可视部件类库(VCL)的各个方面.它们不但供应了在内存、外存和Windows资源中管理对象的功效,还供应了在数据库BLOB字段中对象的功效.

  在本章中将介绍Stream对象和Filer对象的实现原理、利用办法以及在超媒体系统中的利用.这关于应用Delphi 开辟高级利用是很重要的.

 

20.1 流式对象的实现原理和利用

 

  Stream对象,又称流式对象,是TStreamTHandleStreamTFileStreamTMemoryStreamTResourceStreamTBlobStream等的统称.它们辨别代表了在各种媒介上存储数据的本领,它们将各种数据范例(包含对象和部件) 在内存、外存和数据库字段中的管理操作抽象为对象办法,并且充分操纵了面向对象技术的长处,利用程序可以相当简单地在各种Stream对象中拷贝数据.

  下面介绍各种对象的数据和办法及利用办法.

 

20.1.1 TStream对象

 

  TStream对象是能在各种媒介中存储二进制数据的对象的抽象对象.从TStream 对象担当的对象用于在内存、Windows资源文件、磁盘文件和数据库字段等媒介中存储数据.

  TStream中定义了两个属性:SizePosition.它们辨别以字节为单位表示的流的大小和当前指针位置.TStream中定义的办法用于在各种流中读、写和彼此拷贝二进制数据.因为全部的Stream对象都是从TStream中担当来的,所以在TStream中定义的域和办法都能被Stream对象调用和拜候.此外,又由于面向对象技术的动态联编功效,TStream为各种流的利用供应了统一的接口,简化了流的利用;差别Stream对象是抽象了对差别存储媒介的数据上的操作,因此,TStream的需办法为在差别媒介间的数据拷贝供应了最简便的手段.

 

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;

CopyFromSource所指定的流中拷贝Count个字节到当前流中, 并将指针从当前位置移动Count个字节数,函数返回值是实际拷贝的字节数.

  4. Read办法

  声明:function Read(var Buffer; Count: Longint): Longint; virtual; abstract;

Read办法从当前流中的当前位置起将Count个字节的内容复制到Buffer中,并把当前指针向后移动Count个字节数,函数返回值是实际读的字节数.假如返回值小于Count,这意味着读操作在读满所需字节数前指针已经到达了流的尾部.

  Read办法是抽象办法.每个后继Stream对象都要按照自己特有的有关特定存储媒介的读操作覆盖该办法.并且流的全部别的的读数据的办法(如:ReadBuffer,ReadComponent等)在完成实际的读操作时都调用了Read办法.面向对象的动态联编的长处就表目前这儿.因为后继Stream对象只需覆盖Read办法,而别的读操作(ReadBufferReadComponent)都不需求重新定义,并且TStream还供应了统一的接口.

  5. ReadBuffer办法

  声明:procedure ReadBuffer(var Buffer; Count: Longint);

  ReadBuffer办法从流中将Count个字节复制到Buffer 中, 并将流的当前指针向后移动Count个字节.如读操作超越流的尾部,ReadBuffer办法惹起EReadError非常事件.

  6. ReadComponent办法

  声明:function ReadComponent(Instance: TComponent): TComponent;

ReadComponent办法从当前流中读取由Instance所指定的部件,函数返回所读的部件.ReadComponent在读Instance及其拥有的全部对象时成立了一个Reader对象并调用它的ReadRootComponent办法.

  假如Instancenil,ReadComponent的办法基于流中描写的部件范例信息成立部件,并返回新成立的部件.

  7. ReadComponentRes办法

  声明:function ReadComponentRes(Instance: TComponent): TComponent;

ReadComponentRes办法从流中读取Instance指定的部件,但是流的当前位置必须是由WriteComponentRes办法所写入的部件的位置.

  ReadComponentRes 首先调用ReadResHeader办法从流中读取资源头,然后调用ReadComponent办法读取Instance.假如流的当前位置不包含一个资源头.ReadResHeader将引发一个EInvalidImage非常事件.在Classes库单元中也包含一个名为ReadComponentRes的函数,该函数履行相同的操作,只不过它基于利用程序包含的资源成立自己的流.

  8. ReadResHeader办法

  声明:procedure ReadResHeader;

ReadResHeader办法从流的当前位置读取Windows资源文件头,并将流的当前位置指针移到该文件头的尾部.假如流不包含一个有效的资源文件头,ReadResHeader将引发一个EInvalidImage非常事件.

  流的ReadComponentRes办法在从资源文件中读取部件之前,会自动调用ReadResHeader办法,因此,普通程序员普通不需求自己调用它.

  9. Seek办法

  声明:function Seek(Offset: 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对象式管理的对象中有两类对象的办法都有称为Write的:Stream对象和Filer对象.Stream对象的Write办法将数据写进流中.Filer对象通过相关的传播送数据,在后文中会介绍这类办法.

  Stream对象的Write办法声明以下:

 

function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

 

Write办法将Buffer中的Count个字节写入流中,并将当前位置指针向流的尾部移动Count个字节,函数返回写入的字节数.

  TStreamWrite办法是抽象的,每个担当的Stream对象都要通过覆盖该办法来供应向特定存储媒介(内存、磁盘文件等)写数据的特定办法.流的别的全部写数据的办法(WriteBufferWriteComponent)都调用Write承当实际的写操作.

  11. WriteBuffer办法

  声明:procedure WriteBuffer(const Buffer; Count: Longint);

  WriteBuffer的功效与Write类似.WriteBuffer办法调用Write来履行实际的写操作,假如流没能写全部字节,WriteBuffer会触发一个EWriteError非常事件.

  12. WriteComponent办法

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

  Stream对象的WriteComponent办法声明是这样的:

procedure WriteComponent(Instance: Tcomponent);

 

  WriteComponent成立一个Writer对象,并调用WriterWriteRootComponent办法将Instance及其拥有的对象写入流.

  13. WriteComponentRes办法

  声明:WriteComponentRes(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办法将Instance部件写入流中.Instance可以是从Ancestor部件担当的窗体,也可以是在从祖先窗体中担当的窗体中呼应于祖先窗体中Ancestor部件的部件.

  15. WriteDescendantRes办法

  声明:procedure WriteDescendantRes(const ResName: String;

Instance, Ancestor: TComponent);

  WriteDescendantRes办法将Windows资源文件头写入流,并利用ResName作用资源名,然后调用WriteDescendant办法,将Instance写入流.


  以上是“第二十章 开辟Delphi对象式数据管理功效(一)[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 第二十章 开辟Delphi对象式数据管理功效(五)
  • 第二十章 开辟Delphi对象式数据管理功效(四)
  • 第二十章 开辟Delphi对象式数据管理功效(三)
  • <b>第二十章 开辟Delphi对象式数据管理功效(二)</b>
  • 第二十章 开辟Delphi对象式数据管理功效(一)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .