第二十章-开发Delphi对象式数据管理功能(五)(1)

20.3.1.1写DFM文件的过程:WriteComponentResFie

该过程带有两个参数FileName和Instance。FileName参数指定要写入的DFM文件名,Instance参数是TComponent类型的,它指定要写入的部件名,一般是TForm对象的子类。该过程将Instance部件和其拥有的所有部件写入DFM文件。

这个过程的意义在于,可以在程序运行过程中产生Delphi的窗体部件和在窗体中插入部件,并由该函数将窗体写入DFM文件,支持了动态DFM文件的重用性。

该过程的程序是这样的:

procedure WriteComponentResFile(const FileName: string; Instance: TComponent);

var

Stream: TStream;

begin

Stream := TFileStream.Create(FileName, fmCreate);

try

Stream.WriteComponentRes(Instance.ClassName, Instance);

finally

Stream.Free;

end;

end;

函数中,用FileStream创建文件,用Stream对象的WriteComponetRes方法将Instance写入流中。

20.3.1.2 读DFM文件的函数:ReadComponentResFile

ReadComponentResFile函数带有两个参数FileName和Instance。FileName参数指定要读DFM文件名,Instance参数指定从DFM文件中要读的部件。该函数从DFM文件中将Instance和它拥有的所有部件,并返回该部件。

这个函数的意义在于,配合WriteComponentResFile过程的使用支持DFM文件的重用性。

该函数的程序是这样的:

function ReadComponentResFile(const FileName: string; Instance: TComponent):

TComponent;

var

Stream: TStream;

begin

Stream := TFileStream.Create(FileName, fmOpenRead);

try

Result := Stream.ReadComponentRes(Instance);

finally

Stream.Free;

end;

end;

程序中使用FileStream对象打开由FileName指定的DFM文件,然后用Stream对象的ReadComponentRes方法读出Instance,并将读的结果作为函数的返回值。

20.3.1.3 读取Delphi应用程序资源中的部件

函数InternalReadComponentRes可以读取Delphi应用程序资源中的部件。Delphi 的DFM文件在程序经过编译链接后被嵌入应用程序的资源中,而且格式发生了改变,即少了资源文件头。

在第一节中曾经介绍过TResourceStream对象,该对象是操作资源媒介上的数据的。函数InternalReadComponentRes用了TResourceStream。程序是这样的:

function InternalReadComponentRes(const ResName: string;

var Instance: TComponent): Boolean;

var

HRsrc: THandle;

begin { 避免“EResNotFound”异常事件的出现 }

HRsrc := FindResource(HInstance, PChar(ResName), RT_RCDATA);

Result := HRsrc <> 0;

if not Result then Exit;

FreeResource(HRsrc);

with TResourceStream.Create(HInstance, ResName, RT_RCDATA) do

try

Instance := ReadComponent(Instance);

finally

Free;

end;

Result := True;

end;

HInstance是一个Delphi VCL定义的全局变量,代表当前应用程序的句柄。函数用了资源访问API函数FindResource来测定是否存在ResName所描述资源。因为在TResourceStream的创建过程还有FindResource等操作,所以函数中调用了FreeResource。最后函数调用了Stream对象的ReadComponent方法读出部件。因为函数的Instance是var类型的参数,所以可以访问Instance,得到读出的部件。

时间: 2024-11-10 00:27:54

第二十章-开发Delphi对象式数据管理功能(五)(1)的相关文章

第二十章-开发Delphi对象式数据管理功能(四)(6)

7. SetName方法和OnSetName事件 因为在OnSetName事件中,Name参数是var型的,所以可以用OnSetName事件处理过程修改所读部件的名字.而OnSetName事件处理过程是在SetName方法中实现的. procedure TReader.SetName(Component: TComponent; var Name: string); begin if Assigned(FOnSetName) then FOnSetName(Self, Component, Na

第二十章-开发Delphi对象式数据管理功能(一)-(1)

面向对象技术是九十年代的主流技术,各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质.在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特色. Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境.Delphi的核心是部件.部件是对象的一种.Delphi应用程序完全是由部件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术. 对象式数据管理包括两方面的内容: ● 用

第二十章-开发Delphi对象式数据管理功能(一)-(2)

20.1.1.2 TStream的实现原理 TStream对象是Stream对象的基础类,这是Stream对象的基础.为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,.因此,了解TStream是掌握Stream对象管理的核心.Borland公司虽然提供了Stream对象的接口说明文档,但对于其实现和应用方法却没有提及,笔者是从Borland Delphi 2.0 Client/Server Suite 提供的源代码和部分例子程序中掌握了流式对象

第二十章-开发Delphi对象式数据管理功能(五)(6)

20.3.2.4 BLOB字段与Stream对象 因为Delphi中,BLOB字段是通过BLOB流来访问的,所以可以很容易地在BLOB字段和Stream对象之间传递数据.为此,TBlobField对象提供了LoadFromStream和SaveToStream方法. procedure TBlobField.LoadFromStream(Stream: TStream); var BlobStream: TBlobStream; begin BlobStream := TBlobStream.C

第二十章-开发Delphi对象式数据管理功能(五)(4)

3. 动态DFM文件应用之二:超媒体系统脚本语言设计 超媒体脚本语言设计是超媒体系统设计的重要内容.脚本语言必须能够表达卡片中的多种媒体对象,必须是可编程,可理解的,必须是可执行的,应该可以由脚本语言生成超媒体系统中的卡片和链. DFM文件可以看作是超媒体系统的卡片,DFM脚本能够表达DFM文件中的多种控制,也就是说能够表达卡片中的多种媒体对象,再加上DFM脚本的对象式表达,可编辑性,可转换为DFM文件,因此用作超媒体系统脚本语言较好的形式. ObjectBinaryToText和ObjectT

第二十章-开发Delphi对象式数据管理功能(五)(5)

20.3.2 数据库BLOB字段应用 Delphi VCL提供了TBlobStream对象支持对数据库BLOB字段的存取.Delphi 的TBlobStream对象的作用在于一方面可以使Delphi应用程序充分利用多媒体数据库的数据管理能力.另一方面又能利用Delphi Object Pascal的程序设计能力给关系型多媒体数据库提供底层控制能力和全方位的功能扩展余地. 20.3.2.1 TBlobStream的使用 TBlobStream对象用一个TBlobField类型的对象作为参数来创建与

第二十章-开发Delphi对象式数据管理功能(五)(3)

20.3.1.5 动态DFM文件应用揭秘 1. 动态DFM文件概述 动态DFM文件是相对于静态DFM文件而言.所谓静态DFM文件是指在Delphi开发环境中设计的窗体文件.窗体的设计过程就是程序的编制过程.因此,动态DFM文件就是指在程序运行过程生成或存取的DFM文件. 动态DFM文件的创建和使用分别如下两种情况: ● 在程序运行过程中,由Create方法动态生成窗体或部件,然后动态生成其它部件插入其中生成DFM文件 ● 在Delphi开发环境中,设计生成DFM文件,然后用DFM 文件存取函数,

第二十章-开发Delphi对象式数据管理功能(五)(2)

20.3.1.4 DFM文件与标准文本文件(TXT文件)的相互转换 在Delphi可视化设计环境中,允许程序员在代码编辑器中以文本的方式浏览和修改DFM文件内容.当用File/Open命令直接打开DFM文件或者选择窗体设计窗口的弹出式菜单上的View as Text命令时,就会在编辑器中出现文本形式的信息.我们姑且将这种文本形式称之为窗体设计脚本.Delphi提供的这种脚本编辑功能是对Delphi可视化设计的一大补充.当然这个脚本编辑能力是有限制的,比方说不能在脚本任意地添加和删除部件,因为代码

第二十章-开发Delphi对象式数据管理功能(二)(2)

4. 析构方法Destroy 该方法产生给资源解锁,然后释放该资源,最后调用继承的Destroy方法释放ResourceStream.其实现如下: destructor TResourceStream.Destroy; begin UnlockResource(HGlobal); FreeResource(HResInfo); inherited Destroy; end; 回顾Initialize方法,我们不难发现: ● ResourceStream没有额外地给资源重新分配内存,而是直接使用H