Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7829766
  • 博文数量: 92
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 5216
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-15 17:17
文章分类

全部博文(92)

文章存档

2011年(1)

2008年(91)

我的朋友

分类: WINDOWS

2008-08-28 10:45:40

使用Delphi快速开发ActiveX控件

所属类别:
推荐指数:★★★★
文档人气:7501
本周人气:51
发布日期:2006-3-22
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提供了一个类型库编辑器,用于观察或修改类型库,见图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 Helper选项,Delphi将随时提示你应该输入的内容):




  Property BRowSelect:WordBool;


  点击OK后,这个属性的相关信息将自动加入到的实现文件、类型库文件和对应的Pascal文件中。因为的接口是双向的,所以在Pascal文件里使用了读和写两个方法来实现的属性。

  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;

  这时候这两个方法的实现体是空的,必须得自己填入具体实现的代码:



  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;


  这时候,使用类型库编辑器来查看类型库,可以看到新增加的BRowSelect属性。类似的,我们还可以往ActiveX里加入更多的属性。

  还可以往ActiveX加入新的方法、事件,加入的方法与加入属性类似。而且加入以后,Delphi也会自动往相应的文件中加入对应方法和事件的声明和实现,具体的实现体还得自己编写,这里不再多说。

  我们可以注意到,Delphi自动生成了把VCL构件包装成ActiveX所需的包装代码。我们为ActiveX增加新的属性、方法和事件的时候,只需要在接口方法的实现里把ActiveX的数据与VCL构件的数据联系起来,或者使用VCL构件的方法来完成ActiveX的行为,而基本上不需要关心编写一个ActiveX的具体细节,例如COM规约等。

  前面提到,还可以为ActiveX添加定制的属性页。这里不必专门添加新的属性页,因为大多数支持ActiveX的IDE环境已经缺省为每个ActiveX提供了一个包含所有属性的属性页了,我们使用这个缺省的属性页即可。

  好了,做好了前面这些工作以后,选择Project菜单的Build StringGridXControl1命令即可生成我们所需要的ActiveX。在项目的目录下,我们可以找到StringGridXControl1.ocx这个文件,这个就是我们的ActiveX啦!把它拷贝到Windows 9x的System目录或者Windows NT/2000的System32目录里面,然后使用命令regsvr32 StringGridXControl1.ocx在系统中注册这个StringGridX,就可以在VC中使用了。


  三、小结


  由于有了Delphi对开发ActiveX强有力的支持,我们基本不费什么功夫就很快得到了一个新的ActiveX。Delphi让使用它来开发ActiveX的开发人员把注意力集中到了作为ActiveX基础的VCL构件上,而不必过多地关心ActiveX的细节,所以让对ActiveX技术不是太熟悉的开发者也能够享受到开发ActiveX的乐趣,而且也大大丰富了在VC、VB里开发能够利用的。
阅读(2097) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~