欢迎来到图者知识网!

江苏省计算机二级讲义,计算机等级考试二级

教育考试 时间:2019-12-29

【www.tuzhexing.com--教育考试】

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, Name);

Component.Name := Name;

end;

SetName方法和OnSetName事件在动态DFM文件的编程中有很重要的作用。

8. TReader的错误处理

TReader的错误处理是由Error方法和OnError事件的配合使用完成的。OnError 事件处理过程的Handled参数是var型的布尔变量,通过将Handled设为True或False可影响TReader 的错误处理。OnError事件处理过程是在Error方法中调用的。

function TReader.Error(const Message: string): Boolean;

begin

Result := False;

if Assigned(FOnError) then FOnError(Self, Message, Result);

end;

9. FindMethod和OnFindMethod事件

有时,在程序运行期间,给部件的方法指针(主要是事件处理过程)动态赋值是很有用的,这样就能动态地改变部件响应事件的方式。在流中读取部件扞做到一点就要利用OnFindMehtod事件。OnFIndMethod事件是在FindMethod方法中被调用的。

function TReader.FindMethod(Root: TComponent;

const MethodName: string): Pointer;

var

Error: Boolean;

begin

Result := Root.MethodAddress(MethodName);

Error := Result = nil;

if Assigned(FOnFindMethod) then FOnFindMethod(Self, MethodName, Result,

Error);

if Error then PropValueError;

end;

OnFindMethod 方法除了可以给部件的MethodName所指定的方法指针动态赋值外,还可修改Error参数来决定是否处理Missing Method错误。方法中调用的MehtodAddress 方法定义在TObject中,它是个很有用的方法,它可以得到对象中定义的public方法的地址。FindMethod方法和OnFindMethod事件在动态DFM的编程中有很重要的作用。

20.3 Delphi对象式数据管理应用实例

Delphi 2.0无论是其可视化设计工具,还是可视化部件类库(VCL),都处处渗透了对象存储技术,本节将从Delphi可视化设计内部机制、VCL中的数据存储、BLOB数据操作和动态生成部件的存储几方面介绍对象存储功能的实例应用。

20.3.1 Delphi 动态DFM文件及部件的存取在超媒体系统中的应用

Delphi的可视化设计工具是同其部件类库紧密结合在一起的。

每个部件只有通过一段注册程序并通过Delphi的Install Component功能,才能出现在Component Palette上;部件的属性才有可能出现在Object Inspector窗口中;部件的属性编辑器才能被Delphi环境使用。因为这种浑然天成的关系,DFM文件存取必然得到VCL在程序上的支持。

DFM文件的部件存取是Delphi可视化设计环境中文件存取的中心问题。因为Delphi可视化设计的核心是窗体的设计。每个窗体对应一个库单元,是应用程序的模块,窗体在磁盘上的存储就是DFM文件。

DFM文件结构我们前面介绍过了。它实际上是存储窗体及其拥有的所有 有部件的属性。这种拥有关系是递归的。问题在于如何将这些属性数据与程序中的变量(属性)代码联系起来。

在Delphi中处理这种联系的过程分为两种情况:设计时和运行时。

在设计时,建立联系表现为读取DFM 文件,建立DFM文件中的部件及其属性与可视化设计工具(Object Inspector、窗体设计窗口和代码编辑器)的联系,也就是说让这些部件及其属性能出现在这些窗口中,并与代码中的属性定义联系起来;分解联系表现为存储DFM文件,将窗体窗口中的部件及其属性写入DFM文件。

在运行时,主要是建立联系的过程,即读取DFM文件。这时,DFM文件不是作为独立的磁盘文件,而是以应用程序资源中的RCDATA类型的二进制数据存在。建立联系的过程表现为将资源中的部件及其属性与应用程序中的对象及其数据域联系起来。其过程为:根据DFM中的部件类名创建对象,再将用DFM中的部件属性值给程序中的部件属性赋值。当然要完成这一过程,还必须在代码中有相应的窗体定义,因为方法等代码是不存入部件的。

VCL对读取DFM文件在代码上的支持是通过Stream对象和Filer对象达到的。在20. 1和20.1节中,我们可以看到Stream对象和Filer对象中有大量的用于存取部件及其属性的方法,尤其在TReader对象中,还有关于错误处理和动态的方法赋值的方法。下面我们就通过程序实例介绍存取DFM文件方法、步骤和注意事项。

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写入流中。

本文来源:http://www.tuzhexing.com/jiaoyu/996662/

推荐内容