其他语言

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

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


发布日期:2022年03月07日
 
DELPHI基础教程:开发Delphi对象式数据管理功能(五)[4]

BLOB字段与文本

Delphi BLOB字段中增加了大型文本的处理能力可以在TBlobField和Strings中自由地交换数据

procedure TBlobFieldLoadFromStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStreamCreate(Self bmWrite)

try

StringsSaveToStream(BlobStream)

finally

BlobStreamFree;

end;

end;

procedure TBlobFieldSaveToStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStreamCreate(Self bmRead)

try

StringsLoadFromStream(BlobStream)

finally

BlobStreamFree;

end;

end;

BLOB字段与Stream对象

因为Delphi中BLOB字段是通过BLOB流来访问的所以可以很容易地在BLOB字段和Stream对象之间传递数据为此TBlobField对象提供了LoadFromStream和SaveToStream方法

procedure TBlobFieldLoadFromStream(Stream: TStream)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStreamCreate(Self bmWrite)

try

BlobStreamCopyFrom(Stream

finally

BlobStreamFree;

end;

end;

procedure TBlobFieldSaveToStream(Stream: TStream)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStreamCreate(Self bmRead)

try

StreamCopyFrom(BlobStream

finally

BlobStreamFree;

end;

end;

存取嵌入在OleContainer对象中的OLE服务器的数据

对象链接和嵌入(Object Linking and Embedding简称OLE)是一组服务功能它提供了一种用来源于不同应用程序的信息创建复合文档的强有力方法

通过把图像图形表格声音注解文件和其它表示手段描述成对象用它能在不同软件厂家提供的应用程序中更为容易地交换合成和处理数据它是应用程序的集成更为容易OLE支持直观编辑用户不需切换到不同窗口就能在文档中直接对对象进行操作改进了操作环境用户不用再关注应用程序和操作环境只需关注于使用对象技术的数据和文件便能完成全部工作

OLE已成为操作系统功能上的一大标准各大软商纷纷在开发工具中支持OLE 规范Delphi 提供了OleContainer对象支持OLE窗户应用程序的开发

尽管通过OLE可以用来源于不同应用程序的信息创建复合文档充分体现以任务以文档为中心的思想但是很难分解来自其它应用程序中的嵌入数据以进行特殊的处理

例如一套多媒体电子文档管理系统系统需要数据库管理功能文档编辑功能全文检索功能等在文档编辑功能的实现上如果能利用中文Word 或写字板之类的强大的编辑排版功能就可以省却重新开发一个文档编辑的费用使用具有直观编辑的OLE复合文档嵌入Word的DOC数据或RTF数据当然是最佳的选择 但问题在于全文检索系统要求能直接在文档中搜索关键字因此要求将文档数据从OLE嵌入数据或文档中的本地数据中分离出来

Delphi 的OleContainer部件支持存储OLE对象数据OLE对象数据包括两部分OLE类描述信息和OLE服务器嵌入数据一般说来OLE服务器嵌入数据是以服务器支持的数据格式存储的 比方说中文Word 的嵌入数据的格式就是Word 文档的格式因此要将文档数据从OLE 嵌入式文档中分离出来就是要访问第二部分数据

我们分析了Delphi 的OleContainer对象存取复合文档的程序得到分离数据的方法

让我们来看一段OleContainer对象存储数据的程序

procedure TOleContainerSaveToStream(Stream: TStream)

var

DataHandle: HGlobal;

Buffer: Pointer;

Header: TStreamHeader;

R: TRect;

……

begin

……

try

……

if FOldStreamFormat then

begin

R := BoundsRect;

HeaderPartRectLeft := RLeft;

HeaderPartRectTop := RTop;

HeaderPartRectRight := RRight;

HeaderPartRectBottom := RBottom;

end else

begin

HeaderSignature := StreamSignature;

HeaderDrawAspect := FDrawAspect;

end;

HeaderDataSize := GlobalSize(DataHandle)

StreamWriteBuffer(Header SizeOf(Header))

Buffer := GlobalLock(DataHandle)

try

StreamWriteBuffer(Buffer^ HeaderDataSize)

finally

GlobalUnlock(DataHandle)

end;

finally

ReleaseObject(TempStorage)

ReleaseObject(TempLockBytes)

end;

end;

程序中OleContainer对象执行了两次往流中写数据的操作

StreamWriteBuffer(Header Size(Header))

StreamWriteBuffer(Buffer^ HeaderDataSize)

前一语句是写入OLE类描述信息后一句语句是写入OLE服务器的嵌入数据Header是TStreamHeader记录类型的变量TStreamHeader记录的定义如下

TStreamHeader = record

case Integer of

: ( { 新版OLE对象 }

Signature: Integer;

DrawAspect: Integer;

DataSize: Integer)

: ( { 旧版OLE对象 }

PartRect: TSmallRect)

end;

因此读OLE服务器嵌入数据时要跳过文件头的TStreamHeader记录下面就是如何分离OLE服务器嵌入数据的程序

var

Stream : TMemoryStream;

FileStream : TFileStream;

begin

Stream := TMemoryStreamCreate;

FileStream := TFileStreamCreate(TESTDOC fmCreate) ;

with OleContainer do

if (State <> osEmpty) then

SaveToStream(Stream)

StreamSeek(Sizeof(TStreamHeader)

FileStreamCopyFrom(Stream StreamSize SizeOf(TStreamHeader))

StreamFree;

FileStreamFree;

end;

OleContainer包含的服务器对象是中文Word 程序中将分离出的数据存储在磁盘文件TESTDOC如果希望存储在不同的媒介上可以使用相应的Stream对象分离的方法类似但是这种方法并非对所有的OLE服务器数据都适用如Windows 附件中的写字板(WordPad)就不行

返回目录DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

JEE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLEG数据库开发优化指南

Java程序性能优化让你的Java程序更快更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

[] [] [] []

               

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

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