使用Delphi快速开发ActiveX控件

来源:互联网 发布:aicc软件免费下载 编辑:程序博客网 时间:2024/05/01 23:06

使用Delphi快速开发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提供了一个类型库编辑器,用于观察或修改类型库,见图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里开发能够利用的控件。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenyq2008/archive/2008/01/30/2072596.aspx

2008-11-13

开发IE控件ActiveX(Delphi 打印控件)

文章分类:Java编程 关键字: activex ie控件 fastreport
    一直以来都觉得开发IE控件是一件非常难的事情,都是一些比较资深的程序员开发的,对于开发IE控件真的是觉得无从下手。 

    经过这几天的,查资料,问别人,瞎摸索终于做出了我的第一个IE控件--汽车电子客票打印控件。下面按照自己的步骤,记录一下,以免以后自己都忘了,我这里是用Delphi7开发的(学校的课程设计时学过,后来一直都没用过,手生得很),使用了FastReport报表打印控件(http://fast-report.com/en/),以及Delphi7 WebDeploy发布工具(http://www.2ccc.com/article.asp?articleid=4381): 

    1、安装Delphi及插件,由于不会在Delphi上安装插件,还是费了不少功夫,问别人。 
    
    2、新建一个ActiveX工程,我这里选的是“ActiveX Form”,至于其它的选项,我还真不知道是用来开发什么的。 

    3、开发Delphi程序,接下来的事情,就是拖控件,写代码了。其中很多时候需要调试,不知道有没有什么好的办法,自己觉得开发ActiveX控件,调试还是比较麻烦的,所以,我基本上是先在普通的Application Form上先把一些比较难弄、需要多次的程序写好,再拷到“ActiveX Form”工程中(详细的delphi+fastReport的开发过程下面再说)。 

    4、用WebDeploy发布,之前需要先在“Web deployment options”里,选择发布路径,发布后,会自动生成一个html文件了一个ocx控件,其中html里的代码还需要自己去调一下,大小啊,位置啊,还有就是object标签的ocx路径,最好改成相对路径,否则好像会报access拒绝的错误。 

    5、用IE打开这个html,选择警告中的“允许阻止的内容”,这样就会安装控件了,它安装在了“C:/WINDOWS/Downloaded Program Files”这个路径下,如果需要再次改代码、调试,你需要从这里把它右键删除掉(需要关掉这个html页面,否则删不掉) 

    6、接下来你会觉得,安装的这个控件的图标有点丑(delphi的默认图标),在project->options->application发现这个东西,还不让改,怎么办,查资料,“http://topic.csdn.net/t/20041021/14/3477746.html”我好像两种办法都试了一次,但总是改不了,后来重启一次,发现这个是已经改掉了。 
引用

3楼myy()回复于 2004-10-27 10:28:59 得分 30两种办法皆可:    
  1. 用Image   Editor打开   工程名.res   文件,编辑里面的“MAINICON”,保存。    
  2.写个   .rc   文件,内容:    
  A_MY_ICON       ICON       E:/MyWork/MyOcx/my.ico     
  添家加到工程中即可,注意“A_MY_ICON”这个名字按字符串排序,   
  不能排在“MAINICON”后面。 


    7、还会发现个问题,自己写的ocx控件好像体积很大,我自己用了fastReport控件总共下来ocx有1550k,这么大,得减肥。接着查资料“http://www.delphibbs.com/keylife/iblog_show.asp?xid=19233”,我好像把那个勾打上,就成了248K了,真的很神奇!如果有时间,再把里面的包一个一个删的试试。 
引用

KeyLife富翁笔记  
作者: 木桩 
标题: 一步给你的Delphi程序减减肥(从443KB减到34KB) 
关键字: 减肥 包 
分类: 个人专区 
密级: 公开 
(评分:★ , 回复: 5, 阅读: 1654) »» 
是不是觉得Delphi2006编译出的文件都是大块头呢? 
动不动就300KB,确实麻烦。实际上那是因为文件里包含的Packages太多的缘故,下面就教你一种方法,去掉不要的Packages! 

选菜单里的 Project -> Options.. (Shift+Ctrl+F11) 
出现Project Options for Project1.exe窗口,在左边选 Packages 
出现如下图的东西,这样修改: 
1> 将Runtime packages里的[ ]Build with runtime packages钩上 
2> 将不需要的包去掉就行了。(一般编写Win32的程序,只要rtl;vcl就行) 

如果实在不知道该去哪个,可以在上面的Design packages里选择一个包,点Components按钮就可以查看这个包提供的控件。如果没用过这个包,去掉前面的钩就行了。 


    8、真实的web应用(目前还没弄好,弄好后再补上) 

下面说一下delphi+fastReport的开发中遇到问题: 
    1、fastReport根本没用过,查资料学习: 
    demo:在官网上下载过来的文件里有一些demo可以看 
    FastReport开发指南:http://download.csdn.net/source/573124 
    一篇短小文章:http://www.qq08.net/article/2007/1019/article_26559.html 

    2、在用barCode(条形码控件)时,总是会报错,原来除了在报表在放barCode,还需要在form上放一个frxBarCodeObject控件,(FastReport开发指南中也提到了)。 

    3、怎么样给barCode动态传Code进去,这里有个牛人,回答的非常棒http://delphi.ktop.com.tw/board.php?cid=168&fid=916&tid=66419 

    4、因为自己安装的是英文版的fastReport,在控件的打印预览中,界面是英文,怎么汉化? 
http://www.newasp.net/code/dl004719,这里也有安装说明,但我装的过程似乎不需要那么复杂, 在/Res文件夹下,新建一个"Chinese"把那6个源文件放在里面,运行fastReport目录下的recompile.exe选择好选项,运行编译,就OK 

    5、打印预览的左上角图标是FR的图标,不爽,换! 
http://topic.csdn.net/t/20041015/13/3459272.html,但不知道这里用的是什么版本,我的是3.07找不到那个源文件,我发现有另外一个文件,“frxPreview.pas”(其实搜一下,有三个同名文件,为了保险起见,我改了两个我认为需要的地方) 

 

 

由于项目的需要,近期开始学习用delphi开发一个软电话控件。
      以前接触过一些delphi开发方面的东西(当然都是些皮毛啦),但没接触过ocx控件的开发,在此把一些简单的东西记下来,一方面以后自己可以再学习,另一方面希望对刚刚学习delphi开发ocx控件的初学者有所帮助,如果有什么写的不对和写的不好的地方,还请各位多多指正,在此先谢谢了。
      关于ocx控件的一些基础知识在这里就不说这么多了,网络上有很多这方面的文章,有兴趣的朋友可以到网上去搜搜!!
      Delphi集成开发环境对开发ocx控件提供了很好的支持,只要简单的几步就可以开发出属于自己的ocx控件了,下面是delphi开发ocx的一些简单的步骤:
      1、 打开delphi集成开发环境,选择File->new->other,此时弹出一个多页的窗口,选择ActiveX页,选择ActiveX Form,点击OK后,弹出工程属性框,为ActiveX起一个名字,这样一个ocx控件的工程就建立好了
      2、 保存工程
      这样一个ocx控件就建好了,但这个ocx不具备任何功能,不过这时可以对这个ocx进行编译然后通过web发布,再通过我们就浏览器就可以调用这个ocx控件了,下面介绍下编译和发布的一些简单步骤:
      1、选择project->compile project(ctrl+F9)a编译工程
      2、注册组件:Run->register ActiveX server(说明,当往form中增加新的组件后,编译完后要重新注册,不然的话,新加的组件显示不出来)
      3、发布:project->web deploy ......