面向對象技術是九十年代的主流技術各類應用軟件如果以面向對象的方法構造並且滲透面向對象的風格將使軟件具有更高的品質在面向對象程序設計中對象式數據管理占有很重要的地位在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對象的流中
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25104.html