见图1,可以使用它来增加、修改、删除类型库的各种元素。从图1类型库的界面上可以看到,左边是一个树形结构,各种元素的成员作为子节点出现;右边是根据左边所选中的元素类型显示不同的页签,可以对该元素的一些属性进行编辑。
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控件的开发提供了两个向导:
* ActiveX控件向导可以让你把一个VCL构件包装成为一个ActiveX控件。下面将会使用到这个向导。
* ActiveForm向导则可以把几个VCL构件包装成为一个ActiveX控件或者开发一个完整的ActiveX应用。
在Delphi当中把TStringGrid包装成一个ActiveX控件的过程如下:
首先,要启动ActiveX控件向导,选择File菜单里的New命令,在弹出的对话框里选择ActiveX页签,然后双击ActiveX Control图标即可,如图2所示。向导中的第一个域要求选择一个要进行包装的VCL构件,点击选择TStringGrid。其他几个域取缺省值即可,如果需要包含版本信息等其他信息,也可以选上。点击OK按钮,向导将生成一个Delphi的ActiveX控件开发项目StringGridXControl1,包括以下几个的文件:
1. 一个ActiveX项目文件,包含了启动、初始化一个ActiveX控件所需要的代码。通常是不需要修改这个文件的。
2. 一个类型库文件(TLB扩展名),定义和实现了ActiveX控件向外所提供的接口、属性、方法和事件。Delphi专门为这个文件提供了一个Pascal版本的文件,而且自动维护这两个文件的一致性。
3. 一个ActiveX实现的文件,使用了Delphi ActiveX框架(DAX)定义和实现了这个ActiveX控件,具体实现类型库里定义的接口。这个文件是我们经常需要修改的。DAX是Delphi对ActiveX控件的COM规约的实现方式。
4. 如果选择了包括一个“关于”对话框的话,还有一个对应的对话框实现文件。
Delphi的ActiveX控件向导根据所包装的VCL构件的属性、方法和事件生成了ActiveX控件相应的属性、方法和事件。但是它没有把VCL构件使用非OLE类型(如集合、数组等)的属性、方法和事件转换过去。例如,TStringGrid的Options属性是集合类型的,RowHeights是数组类型的,在控件向导所生成的属性中就没有这些属性。但是有时候偏偏这些属性、方法和事件是很重要的,这时就需要手工添加一些属性、方法和事件!
现在为这个ActiveX控件添加一个BRowSelect属性,这个属性本来是TStringGrid的Options属性的子属性,控制Grid是否处于行选中状态。在StringGridXControl1项目里打开ActiveX实现文件StringGridImp1.pas,选择Edit菜单里的Add To Interface命令(注意:只有打开了实现文件,这个命令才能使用),Delphi将弹出增加接口对话框,如图3所示。在对话框里的Interface项选择Properties/Methods-IStringGridX,然后在Declaration里写入BRowSelect属性的声明(如果你选中了对话框里的Syntax Hel