Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
一、ActiveX应用情况简介:
ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分。ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应用编程接口(Win32 API)和组件对象模型的一系列扩充和增强,目标是把计算机桌面环境与因特网环境集成起来,同时保护在Windows技术中现有的开发投资。微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使用WWW来传递控件。
ActiveX控件可以被集成到很多支持ActiveX的应用当中去,或者直接用来扩展应用的功能,这些支持ActiveX的应用包括C++ Builder、Delphi、Visual dBASE、 Visual Basic、Visual C++、Internet Explorer、Netscape Navigator等。ActiveX控件还可以使用在因特网上,在网页上使用它来发布信息、处理与用户的交互,但是需要使用支持ActiveX的浏览器才能阅读这些网页。目前已经开发出来的ActiveX控件越来越多,由于ActiveX控件具有很好的特性,我们可以在编程的时候选择使用合适的控件来加快自己的应用开发。可以不夸张地说,ActiveX控件是Windows平台编程必不可少的法宝。
使用ActiveX控件是相对比较简单的。但是,开发ActiveX控件并不是一件简单的事情,必须要熟悉而不只是了解ActiveX技术才能开发出好的ActiveX控件。而COM、OLE等ActiveX技术对于一般的程序员来说,是比较复杂难懂的。所以,ActiveX控件的开发者一般都是“老鸟”级别的程序员。
但是如果您有了Inprise公司的Borland Delphi,那又另当别论了。Delphi作为Windows平台上最优秀的程序开发工具之一,为ActiveX控件的开发提供了强有力的支持,让您轻松地开发ActiveX控件。Delphi的开发者仅仅需要了解一些ActiveX控件的简单知识,就可以使用Delphi提供的工具来快速开发自己的 ActiveX控件。本文详细介绍了利用Delphi所提供的工具来快速开发ActiveX控件的技巧。
二、ActiveX控件的相关知识
要开发ActiveX控件,我们先得简单了解一下ActiveX控件的一些相关知识。在Delphi中,一个ActiveX控件由如下几个部分组成: VCL(可视化构件库)控件、属性、方法、事件,以及一个或者多个相关的类型库,其中每个部分都有各自的作用。
现在对每个部分介绍如下:
1、VCL构件
在Delphi中,一个ActiveX控件是由一个或者多个VCL构件经过包装以后得到的。所以,要使用Delphi来开发ActiveX控件,必须先得开发出或者选择要进行包装的VCL构件。也正是由于这个原因,我们可以将Delphi里大量优秀的VCL构件包装成ActiveX控件,从而可以在别的不能够直接使用VCL构件的开发工具(如Visual Basic、Visual C++)里也能够使用到这些控件啦!
但是,在Delphi里可以用来做ActiveX控件的VCL构件必须是TWinControl的后代。如果想用一个TGraphiControl的子类做ActiveX控件,在大多数情况下只需要把它的基类变为TCustomControl即可。有的VCL构件是被注册成非ActiveX控件的,例如EditControl,这些控件也不能做ActiveX控件。
2、类型库
类型库包含了控件的类型定义信息,提供了比接口更多的详细信息,是控件向它的宿主程序提供服务信息的一种途径。类型库的目的是为其他应用编程工具提供关于它包含的构件对象的信息。开发ActiveX控件时,Delphi把类型库信息存入一个.TLB文件中及一个对应的Pascal文件(.TLB文件的Pascal语言版本),编译时类型库将作为资源链入DLL或者EXE等中。
类型库的元素包括:
(1)类型库信息:包括类型库的总体信息和特征、当前类型库引用的其他类型库;
(2)构件类:代表整个ActiveX控件,包含了提供给客户应用的接口;
(3)接口属性和方法、事件;
(4)枚举类型:一种用作数据类型的相关常量,可以用在类型库的其他地方定义属性和方法。
Delphi提供了一个类型库编辑器,用于观察或修改类型库,可以使用它来增加、修改、删除类型库的各种元素。类型库的界面上可以看到,左边是一个树形结构,各种元素的成员作为子节点出现;右边是根据左边所选中的元素类型显示不同的页签,可以对该元素的一些属性进行编辑。
3、属性、方法和事件
VCL构件的属性、方法和事件自然就变成为ActiveX控件的属性、方法和事件。控件的属性,例如颜色、标签等;控件的方法是请求控件执行某些动作;事件则是控件给宿主程序的一个通知,发生了一些事情。
4、属性页
ActiveX控件所带的属性页可以让控件的使用者查看和修改控件的属性。您可以把几个属性捆绑在一个属性页上,也可以只为一个属性提供一个属性页。
三、快速开发ActiveX控件
下面就让我们来使用Delphi具体做一个ActiveX控件。
假设我们现在面临的问题是,在使用Visual C++(VC)开发一个应用的时候,需要使用一个Grid控件来处理界面的事情,而使用VC所提供的FlexGrid控件又很麻烦,发现Delphi里的 TStringGrid构件非常合适。但是TStringGrid是Delphi里的VCL构件,又不能直接被VC使用,怎么办呢?不用愁,我们只要把 TStringGrid包装成为VC可以使用的ActiveX控件就可以解决这个问题了。
Delphi为ActiveX控件的开发提供了两个向导:
1>、ActiveX控件向导可以让你把一个VCL构件包装成为一个ActiveX控件。下面将会使用到这个向导。
2>、ActiveForm向导则可以把几个VCL构件包装成为一个ActiveX控件或者开发一个完整的ActiveX应用。
四、开发实例:
在Delphi当中把TStringGrid包装成一个ActiveX控件的主要步骤:
1、 点击【File】—>【New】—>【Other】菜单项,打开【New Items】,选择【ActiveX】;
2、 选择【ActiveX Library】选项卡,点击ok,创建工程。
3、 点击【File】—>【New】—>【Other】菜单项,打开【New Items】,选择【ActiveX】;
4、 选择【ActiveX Control】选项卡,点击ok,打开【ActiveX Control Wizard】窗口;
5、 在【VCL Class Name】组合框中选择‘VCL’类(如TStringGrid),单击Ok;
6、 添加代码;
7、 运行程序,生成ocx文件。
8、在Delphi中单击【Component】—>【Import ActiveX Control】菜单项,打开【Import ActiveX】窗口,在窗口中点击【Add】,然后选择ocx文件,然后单击Install按钮安装组件。如果成功,在ActiveX组件页中将显示该组件。
1、首先,要启动ActiveX控件向导,创建ActiveX项目
首先,要启动ActiveX控件向导,选择File菜单里的New命令,在弹出的对话框里选择ActiveX页签,然后双击ActiveX Control图标即可。向导中的第一个域要求选择一个要进行包装的VCL构件,点击选择TStringGrid。其他几个域取缺省值即可,如果需要包含版本信息等其他信息,也可以选上。点击OK按钮,向导将生成一个Delphi的ActiveX控件开发项目 StringGridXControl1,包括以下几个的文件:
1. 一个ActiveX项目文件(dpr后缀名),包含了启动、初始化一个ActiveX控件所需要的代码。通常是不需要修改这个文件的。
2. 一个类型库文件(tlb后缀名),定义和实现了ActiveX控件向外所提供的接口、属性、方法和事件。Delphi专门为这个文件提供 了一个Pascal版本的文件(tlb扩展名),而且自动维护这两个文件的一致性。
3. 一个ActiveX实现的文件(Pas扩展名),使用了Delphi ActiveX框架(DAX)定义和实现了这个ActiveX控件,具体实现类型库里定义的接口。这个文件是我们经常需要修改的。DAX是Delphi对ActiveX控件的COM规约的实现方式。
4. 如果选择了包括一个“关于”对话框的话,还有一个对应的对话框实现文件。
Delphi的ActiveX控件向导根据所包装的VCL构件的属性、方法和事件生成了ActiveX控件相应的属性、方法和事件。但是它没有把 VCL构件使用非OLE类型(如集合、数组等)的属性、方法和事件转换过去。例如,TStringGrid的Options属性是集合类型的, RowHeights是数组类型的,在控件向导所生成的属性中就没有这些属性。但是有时候偏偏这些属性、方法和事件是很重要的,这时就需要手工添加一些属性、方法和事件!
2、在ActiveX控件中添加一个属性和实现的方法:
现在为这个ActiveX控件添加一个BRowSelect属性,这个属性本来是TStringGrid的Options属性的子属性,控制Grid是否处于行选中状态。在StringGridXControl1项目里打开ActiveX实现文件StringGridImp1.pas,选择【Edit】菜单里的【Add To Interface】命令(注意:只有打开了实现文件,这个命令才能使用),Delphi将弹出增加接口对话框。在对话框里的Interface项选择Properties/Methods-IStringGridX,然后在Declaration里写入BRowSelect属性的声明(如果你选中了对话框里的Syntax Helper选项,Delphi将随时提示你应该输入的内容):Property BRowSelect:WordBool;点击OK后,这个属性的相关信息将自动加入到控件的实现文件、类型库文件和对应的Pascal文件中。因为控件的接口是双向的,所以在Pascal文件里使用了读和写两个方法来实现控件的属性。
1>、Delphi自动在类型库里加入了以下声明:
property BRowSelect: WordBool read Get_BRowSelect write Set_BRowSelect;
这说明了:对于BRowSelect这个属性,有一个读方法Get_BRowSelect,一个写方法Set_BRowSelect。Delphi自动在控件的实现文件里加入了对BRowSelect属性的读和写访问方法的声明和实现:
function Get_BRowSelect: WordBool; safecall;
procedure Set_BRowSelect(Value: WordBool); safecall;
这时候这两个方法的实现体是空的,必须得自己填入具体实现的代码:
2>、在实现文件中编写代码
function TStringGridX.Get_BRowSelect: WordBool;
begin
//以下代码由自己根据需要编写,获得现在是否处于行选中状态
with FDelphiControl do
Result := goRowSelect in Options ;
end;
procedure TStringGridX.Set_BRowSelect(Value: WordBool);
begin
//以下代码由自己根据需要编写,设置行选中状态
with FDelphiControl do
begin
if Value then
Options := Options + [goRowSelect]
else
Options := Options - [goRowSelect];
end;
end;
3、生成ActiveX控件(OCX控件)
这时候,使用类型库编辑器来查看类型库,可以看到新增加的BRowSelect属性。好了,做好了前面这些工作以后,选择Project菜单的Build StringGridXControl1命令即可生成我们所需要的ActiveX控件。在项目的目录下,我们可以找到 StringGridXControl1.ocx这个文件,这个就是我们的ActiveX控件啦!
4、把ActiveX控件(OCX控件)注册到系统中
1>、在Delphi中单击【Component】—>【Import ActiveX Control】菜单项,打开【Import ActiveX】窗口,在窗口中点击【Add】,然后选择ocx文件,然后单击Install按钮安装组件。如果成功,在ActiveX组件页中将显示该组件。
2>、 把它拷贝到Windows 9x的System目录或者Windows NT/2000的System32目录里面。在DOS命令行状态中,运行命令:regsvr32.exe c:\winnt\system32\alasunsmscon.ocx (regsvr32 StringGridXControl1.ocx)在系统中注册这个StringGridX控件。
3>、在Delphi中,打开创建该ActiveX控件的工程(*.dpr)文件,然后选择Run->Register ActiveX Server.
注意,以上第2种方法和第3种方法操作只是向Windows消息系统注册了该ActiveX控件,但是并没有将其添加到Delphi的VCL库中。还无法在其它程序中调用。我们还需要进行第1中方法中的操作。如果已经注册完毕就可以在Import ActiveX中查找,如果没有就需要点击【Add】充文件的路径添加。
五、小结
类似的我们还可以往ActiveX控件里加入更多的属性。还可以往ActiveX控件加入新的方法、事件,加入的方法与加入属性类似。而且加入以后,Delphi也会自动往相应的文件中加入对应方法和事件的声明和实现,具体的实现体还得自己编写,这里不再多说。
我们可以注意到,Delphi自动生成了把VCL构件包装成ActiveX控件所需的包装代码。我们为ActiveX控件增加新的属性、方法和事件的时候,只需要在接口方法的实现里把ActiveX控件的数据与VCL构件的数据联系起来,或者使用VCL构件的方法来完成ActiveX控件的行为,而基本上不需要关心编写一个ActiveX控件的具体细节,例如COM规约等。
前面提到,还可以为ActiveX控件添加定制的属性页。这里不必专门添加新的属性页,因为大多数支持ActiveX的IDE编程环境已经为每个ActiveX控件提供了一个包含所有属性的属性页了,我们使用这个属性页即可。
由于有了Delphi对开发ActiveX控件强有力的支持,我们基本不费什么功夫就很快得到了一个新的ActiveX控件。Delphi让使用它来开发ActiveX控件的开发人员把注意力集中到了作为ActiveX控件基础的VCL构件上,而不必过多地关心ActiveX控件的细节,所以让对 ActiveX技术不是太熟悉的开发者也能够享受到开发ActiveX控件的乐趣,而且也大大丰富了在VC、VB里开发能够利用的控件。
http://blog.csdn.net/zang141588761/article/details/51248269
Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)的更多相关文章
- Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)
一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delp ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- MFC Activex 开发、ocx打包成cab、部署、测试、自动升级
小小抱怨下:也许是MFC现在用的人少的缘故.在国内和国外都基本上找不到什么全的资料.特别是ocx打包成Cab时的安装文件inf的编写方面,国内基本上是copy,抄的还一知半解.查找个资源真心的累啊.现 ...
- JS调用Delphi编写的OCX控件
原文:http://www.mamicode.com/info-detail-471283.html 一.使用Delphi XE2编写OCX控件 生成OCX工程: 1.File-New-Other,在 ...
- Delphi发布ActiveX控件 制作CAB包 数字签名相关
文件: SignTool.rar 大小: 84KB 下载: 下载 最近我正在研究ActiveX技术.我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序.这个控件产生一 ...
- VC++编写ActiveX控件
ActiveX这门技术是通过生成“*.ocx”文件来实现的.先来了解下OCX文件,在百度百科上面对OCX是这样解释的:“.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件.如果你用过Visual ...
- Delphi安装/卸载OCX控件的方法
delphi 安装卸载ocx 请参见 如下 http://blog.csdn.net/xt_chaoji/article/details/7027298 打开Delphi,关闭所有项目. 1. ...
- [转]C#开发ActiveX控件,.NET开发OCX控件案例
引自:百度 http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网 ...
随机推荐
- P2P理财友情提示
最近2年,P2P理财非常火,但是出现的问题也是越来越频繁. 2014年12月,据说有70多家平台出现了问题,加上以前的,一共有300多家了,出现问题的占总比有20%~30%了. 这个真的是非常的可怕. ...
- 瀑布流的一些CSS实现方式
一个选择是用CSS3的多列columns,可以参考这篇文章.但这篇文章给的例子并不怎么好理解,我做了一些更改,在每个元素上加了序号.可以看到,多列布局是在每一列上依次排列元素的,第一列排完才开始排第二 ...
- 一段node代码的解读
path.join(path.dirname(__dirname), platform); __dirname:全局变量,变量获取当前模块文件所在目录的完整绝对路径 path.dirname():返回 ...
- 类的XML序列化(XML Serialization)
最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变.开始错误的使用了static,导致了致命的共享错误.后来突然想起C#类能够使用XML序列化 ...
- WPF 好看的矢量图标
原文:WPF 好看的矢量图标 本文告诉大家一个好用的网站,里面提供很多好看的图标. 本文介绍的网站是 Xamalot 里面有很多好看的图标. 例如我找到了一个好看的图标 我只需要点击下面的下载就可以了 ...
- PAT 1041-1050 题解
浏览全部代码:请戳 本文谨代表个人思路,欢迎讨论;) 1041. Be Unique (20) 题意 给出 N (<=105)个数(数值范围为 [1, 104]),找到其中不重复的第一个数字.比 ...
- 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...
- 在.net core的web项目中使用kindeditor
本项目是一个.net core的mvc项目 1.下载kindeditor 4.1.11 解压后将文件夹置于 wwwroot目录下,如图: 2.在HomeController的Index控制器对应的in ...
- POJ 1328 Radar Installation(经典贪婪)
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54143 Accepted: 12 ...
- CentOS(一) 最小化安装
/etc/sysconfig/selinux 关闭selinux /etc/sysconfig/network-scripts/网卡 设置onboot=yes service network re ...