Delphi编写高精度定时器ActiveX控件


======================================================
注:本文源代码点此下载
======================================================

本文通过一个编程实例介绍了delphi 7下编写不可视activex控件的方法,并给出了源代码。为使用delphi编写其他类型activex控件的读者提供参考和借鉴。

关键词 delphi,activex控件,定时器,vcl组件

一、前言

delphi下有大量优秀的且提供源码的vcl组件,如果想在其他开发环境(如vb 6.0,vc 6.0,vs.net等)中使用它们,就必须把这些vcl组件转换成activex控件。目前,关于把可视化vcl组件转变为activex控件的资料和例子非常多,而把不可视vcl控件转换成activex控件的资料却很少。笔者在网上找到了一个优秀且开源的高精度定时器vcl组件,经过反复摸索终于成功将其转换成一个activex控件。该控件能够代替vb 6.0中自带的timer控件,而且精度更高。在delphi 7中,actvieform是基于delphi 窗体的activex控件,可以像创建一个标准的delphi窗体一样创建activeform,而不是把单个组件转换成activex控件。本文中,笔者将详细介绍如何利用actvieform来建立一个高精度的定时器activex控件。

二、实现

1.在delphi 7中安装好要使用的vcl组件

本文中要转换的高精度定时器vcl组件的名称为thirestimer,选择delphi主菜单中component菜单下的install component子菜单,弹出安装控件窗体。在unit file name中浏览选择hirestim.pas文件,并点击ok即可。安装成功后,就会看到thirestimer控件3个重要的属性enabled、interval、resolution和一个重要的事件ontimer。在使用activeform建立activex控件时,可以不必太多关心vcl组件源码实现方式,只注意要实现的组件属性和事件即可。

2.创建一个activeform

(1)选择delphi主菜单中file 菜单下的new,然后单击new菜单的子菜单other,弹出对象库窗体。

(2)在 activex页中双击activeform图标,出现activeform wizard(如图1所示)。

                         图1 activeform wizard 主界面

(3)如果想控制其他开发人员使用自己编写的activex控件,选择make control licensed选项。delphi会自动生成扩展名为.lic的许可文件和activex控件一起发布使用。

(4)如果想显示有关activex控件的任何其他信息,请选择 include about box选项。

(5)在 project name中输入项目名称,在 new activex name中输入控件名称,并点击ok。本文中,项目名称为mytimerprj,控件名称为mytimer。

(6)在delphi工具栏中点击save project图标。

本例中首先创建一个空白窗体,窗体名称为mytimer。可以在该窗体上添加想要转换的任何非可视化vcl组件,在这里放置的是一个名为hirestimer1的thirestimer类型控件。

3.activeform文件生成以后,接下来要做的就是编辑activex控件的属性或事件。选择delphi主菜单中view菜单下的type library子菜单,弹出如图2所示的type library editor 。可以直接在其上编辑属性或事件,先把系统默认生成的属性和事件都删除,图2中imytimer的所有子项是属性,imytimerevents的所有子项是事件。然后在imytimer后添加下列属性:

图2 type library 属性设置窗口

enabled:variant_bool

interval:long

resolution:long

当改变上面属性值时,hirestimer1控件对应的属性相应改变。 程序代码如下:

//在 保护字段声明三个变量

protected

{ protected declarations }

finterval:integer;

fresolution:integer;

fenabled:boolean;

//改写defineproperties虚方法,用以实现控件属性值的持久化。

procedure defineproperties(filer: tfiler); override;

procedure tmytimer.defineproperties(filer: tfiler);

begin

inherited;

filer.defineproperty('myproperty',loadproperty,storeproperty,true);

//loadproperty 和storeproperty 是以函数为参数

end;

// 在defineproperties方法中需要一个写变量函数作为参数。

procedure storeproperty(writer:twriter);

procedure tmytimer.storeproperty(writer:twriter);

begin

writer.writeinteger(finterval);

writer.writeinteger(fresolution);

writer.writeboolean(fenabled);

//持久化三个保护字段变量

end;

//在defineproperties方法中需要一个读变量函数作为参数。

procedure loadproperty(reader:treader);

procedure tmytimer.loadproperty(reader:treader);

begin

finterval:=reader.readinteger;

fresolution:=reader.readinteger;

fenabled:=reader.readboolean;

hirestimer1.interval:=finterval;

hirestimer1.resolution:=fresolution;

hirestimer1.enabled:=fenabled;

// 读取属性值

end;

// 当属性值改变时,修改hirestimer1控件对应的属性值。

function tmytimer.get_enabled: wordbool;

begin

result := fenabled;

end;

procedure tmytimer.set_enabled(value: wordbool);

begin

fenabled := value;

hirestimer1.enabled :=fenabled;

//设置hirestimer1.enabled 决定定时器是否工作。

end;

function tmytimer.get_interval: integer;

begin

result:=finterval;

end;

function tmytimer.get_resolution: integer;

begin

result:=fresolution;

end;

procedure tmytimer.set_interval(value: integer);

begin

finterval:=value;

hirestimer1.interval:=finterval;

// hirestimer1.interval的作用和vb自带的timer定时器interval属性功能一致。

end;

procedure tmytimer.set_resolution(value: integer);

begin

fresolution:=value;

hirestimer1.resolution:=fresolution;

// hirestimer1.resolution 属性保证定时器的精度。数值越小精度越高。

end;

添加完属性后,还要在imytimerevents中加入ontimer事件,首先在私有段中定义一个timerevent 函数。然后在程序initialize段中让hirestimer1.ontimer = timerevent;而在timerevent 事件中又调用fevents.ontimer,这样就能在ontimer事件中捕获到hirestimer1.ontimer事件。程序实现如下所示:

procedure tmytimer.initialize;

begin

inherited initialize;

hirestimer1.ontimer:=timerevent;

end;

procedure tmytimer.timerevent(sender: tobject);

begin

if fevents

图 3 调用mytimer控件

三、结语

通过编写不可视activex控件基本的程序框架,便可以编写其他类型的非可视化activex控件,如加密解密,数值计算,系统信息,通用对话框等。使用activeform编写actviex控件的优点之一是可以把那些不提供源代码的vcl组件也能转换成activex控件,通过activex控件使delphi能够和其他可视化开发工具一起混合编程。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值