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控件。在项⽬的⽬录下,我们可以到 这个⽂件,这个就是我们的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命令⾏状态中,运⾏命令: c:\winnt\ ()在系统中注册这个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⾥开发能够利⽤的控件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。