`

Delphi使用VB控件全攻略

阅读更多
<meta content="MSHTML 6.00.2900.3199" name="GENERATOR"> <style></style>2006年07月22日 18:26:00

前言
在最近几周的工作里,始终被一个头疼的问题所困扰,那就是VB6编写的ActiveX控件在Delphi环境下存在着诸多稀奇古怪的问题,几经周折,终于在搜索了几乎全部的论坛、资料后,找到了针对不同Delphi版本发生的问题的解决办法。
Delphi 5 莫名其妙的致命异常之一
首先,我们来看看VB写的ActiveX控件在Delphi 5下面的奇怪表现。
例如:我们用VB编写了一个控件UserTest(为简单起见,我们只导出一个类即用户控件),一个属性TestName,一个方法TestMethod。然后将其编译成一个ActiveX控件,注册并导入Delphi5的开发环境(以上步骤如有未清楚之处,请查阅各类参考资料,肯定有标准答案),到目前为止,看来一切正常。
然后,我们习惯的把控件拖放到窗体上,调整大小,在属性窗口中为属性赋值,或者在代码中也是一样,非常正常,好用的很。但是,下面问题来了,如果您兴致勃勃的去调用了那个TestMethod,那么您将得到一个古怪的异常 “Ole Error 800a01a9”,然后程序退出,而且非常不幸的是,您将无法跟踪到这个异常,在Delphi中或是VB中都是,当然如果您对汇编很在行的话,您可以跟着Delphi的调试窗口一步一步往下……
当我第一次碰到这个问题的时候,我几乎是愤怒的,因为无论是MicroSoft或是Borland,对该错误都没有任何解释,也没有任何可以查找的资料。我只好跑到常去的几个论坛,当然最主要的还是CSDN,在VB版和Delphi版中四处搜索类似的问题,然后非常遗憾的是,只有类似的问题,而没有答案,一个大客户就用的这个开发工具,我在测试了几乎所有Windows上的开发工具和开发环境(包括桌面和WEB)后,惟独将Delphi忘记了。
剩下的两天里,我几乎是满世界乱跑,给所有的朋友打电话,询问Delphi方面的高手是否知道这个情况,最后,我从Google上搜到了一个链接,可惜的是现在我忘记了那个链接的具体位置,但是我得到了一个近乎Magic的方法(发现者是这么称呼它的):
一个手工修改Delphi导入VB ActiveX控件后产生的代理类型库XXX_TLB.PAS(这里XXX指的是控件的类名)文件的方法可以解决这一问题。举例说明:
有一个VB 写的控件 UserControl1 ,在Delphi中导入后产生两个文件,其中一个UserControl1_TLB.PAS 就是我们所要修改的文件。
在文件中查找类似
FintF: _UserControl1;
Function GetControlInterface:_UserControl1;
property ControlInterface: _UserControl1 read GetControlInterface;
GetControlInterface;
以及
procedure TUserControl1.CreateControl;
procedure DoCreate;
begin
Finf:=IUnknown(OleObject) as _UserControl1;
End;
Begin
If Finf=nil then DoCreate;
End;
Function TUserControl1.GetControl1Interface: _UserControl1;
Begin
CreateControl;
Result:=Finfl;
End;
请注意:这里红色标出的_UserControl1全部换成_ UserControl1Disp如果编译不成功的话,请将编译警告中报出的_UserControl1 全部换成 _UserControl1Disp,编译即可,这样在调用控件的方法时便不会出现上述的致命错误。
感谢这个伟大的发现,我只能这么形容它,否则可能到现在我还要在这个圈子里套不出来,或者就是使用另外的工具重新开发这个控件(我难以想象这个工作量会有多大,又或者它可能还会存在其他的兼容性问题)。
Delphi 5 莫名其妙的致命异常之二
但是,Delphi并没有在我绕开这个限制之后而放过我,很快,客户那边发现另一个麻烦的问题,在开发环境下,每次运行时关闭载有控件的窗体都会跳出一个异常错误,但是在编译后的应用程序中则不会,虽然不会影响最终用户的使用,但是这对开发人员来说是个不小的困扰,然后我用了上述例子去试,发现并不会发生这个问题。(我当时就疯了,这很可能是代码中一些不兼容的用法所致,在一天时间里查找上万行代码是不是很正规是件极其恐怖的事情)我一气之下,屏蔽了我的控件中所有的代码,只留下用户界面本身,然后奇怪的事情发生了,我什么代码都没写,但是加载我的控件还是会发生这个错误,这使我又喜又惊,喜的是这个问题和我的代码无关,这样查找起来会方便的多;惊的是只是拖放几个VB中的标准控件居然也会造成这种恐怖的错误,Delphi5VB6之间的矛盾还真不是一般的深。接下来的2个小时里,我不断地删除界面上的控件来测试到底是谁造成了这个致命的异常。
2个小时后,我舒了一口气,问题找到了,其根本问题是:
如果你在VB的用户控件中使用类似FramePictureBox这样的容器控件(其内部可以包含其他控件)时,那么您将不可以在这些控件中添加LabelLineImage这样的windowLess控件(也就是无窗口控件,它们在运行时是VB实时画出来的),否则您就会得到上面这样的错误报告。
Delphi 67 隐蔽的ActiveX控件
正是因为有了Delphi5下面的恐怖经历,我发现还是很有必要在Delphi67下面测试是不是也存在同样的问题(之前的版本因为用户极少已无必要,Delphi8还没正式出,也暂不在考虑之列)。结果是:……无论我加载多少次,我在ActiveX栏上始终没有发现那个期待已久的小图标。这样的结果当然很滑稽,我连加载都做不到,更不要谈什么测试正常不正常了。
同样的,我搜索各类论坛和网站,CSDN里我也发现了更多的类似问题的提出者,但答案还是零,无奈之下,我只好对每个Delphi67中的选项进行调整……
历时3小时1554秒后,我找到了这个该死的问题(请原谅我这么称呼它,我实在是忍无可忍)的原因,或者说是解决办法,说起来其实很简单。
现在请跟着我做:点击Tools菜单-<environment options- library><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">页</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">,</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">我们应该发现一项:</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">Ignore special CoClass Flags When Importing</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">,选中它,然后再选中</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">Can Create</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">那一项,那么现在,我们再尝试去导入那个可怜的</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">ActiveX</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">控件吧(这里要注意,如果你已经导入过一次,那么请把产生的那两个文件</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%"> .dcr </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">和</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%"> .pas</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">文件删除,否则将不会刷新)。这次如果还是不能在</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">ActiveX</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">栏中发现那个控件的话,那么只有致电</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">Microsoft</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">或是</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">Borland</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">,问问看什么时候它们能结成亲家,呵呵</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%">!</span></environment>
(另,在Delphi6和7中倒是没有发现Delphi5中出现的上述错误)
我的测试环境是:
Win2K
Delphi 5 Update1
Delphi 6 Update2
Delphi 7

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=959890


分享到:
评论

相关推荐

    delphi日期时间控件

    这个组件包通常需要先安装到Delphi环境中,才能使用其中的控件。 `UserDateTimePicker`这个名字暗示这是一个自定义的日期时间选择器,可能是对Delphi自带的TDateTimePicker控件的扩展或增强。`UserDateTimePicker....

    delphi sqlite3 控件

    总之,使用 Delphi SQLite3 控件,开发者可以轻松地在 Delphi XE2 环境下构建功能丰富的数据库应用程序,同时享受 SQLite3 的高效性能和无服务器架构带来的便利。通过引用 SQLite3 的 Pascal 源码,还可以确保应用...

    delphi制作复合控件

    7. **测试和使用**:完成以上步骤后,你可以编译并安装组件库,然后在其他Delphi项目中像使用普通控件一样使用TMyCompositeControl。 通过这个"复合控件"实例,我们可以学习到如何在Delphi中构建自定义的用户界面...

    delphi版 Raize控件

    Delphi版的Raize控件是一套专门为Delphi开发者设计的第三方组件库,适用于Delphi 7至Delphi 2012等多个版本。这些控件扩展了Delphi内置的标准控件集,提供了更多功能丰富、设计精美的用户界面元素,以提升应用程序的...

    Delphi使用SPComm控件实现单片机通信.pdf

    Delphi使用SPComm控件实现单片机通信.pdf

    delphi-modbus控件

    在Delphi中,使用Modbus控件可以简化与这些设备的交互过程,无需深入理解底层的通信细节。 该控件版本为1.6.7,可能包含以下特性: 1. 支持Modbus RTU(远程终端单元)和ASCII(美国标准代码交换信息)两种传输模式...

    delphi 的透明控件

    在Delphi编程环境中,透明控件是一个非常实用的功能,它允许开发者创建出具有独特视觉效果的应用程序。在本文中,我们将深入探讨Delphi中的透明属性,以及如何利用它来实现透明按钮(Button)和面板(Panel)等控件...

    delphi小键盘控件

    通过查看和研究源代码,开发者不仅可以直接使用控件,还能学习到如何在Delphi中创建自定义组件,提高自己的编程技能。 总的来说,"delphi小键盘控件"是一个强大的工具,它将便捷性和可定制性结合在一起,为Delphi...

    Delphi2010组件控件安装方法和注意事项

    在编程世界中,Delphi 2010是一款强大的...通过以上步骤和注意事项,你应该能够顺利地在 Delphi 2010 中安装并使用新的组件控件。记住,熟练掌握组件控件的安装和使用,能让你的 Delphi 开发工作变得更加高效和愉快。

    tnt2.3.rar_TNT CONTROLS_delphi7 tntunicode_delphi中tnt控件_tnt2_tnt

    安装完成后,你可以像使用其他Delphi控件一样,在设计时将其拖放到表单上,并通过属性窗口调整其设置。在运行时,这些控件将提供增强的功能和更好的用户体验。 总的来说,TNT Controls是Delphi开发中的一个重要工具...

    delphi 流程图控件源码+demo

    标题中的"delphi 流程图控件源码+demo"表明这是一份关于使用Delphi编程语言开发的流程图控件的源代码及其演示示例。Delphi是一款基于Object Pascal的集成开发环境(IDE),它以其高效能的编译器和丰富的组件库而闻名...

    工业控制 delphi控件

    使用Delphi和Abakus控件开发工业控制软件,开发者可以充分利用Delphi的编译器优势,获得高效的执行效率和良好的跨平台能力。同时,通过组件化的开发方式,降低项目的复杂度,提高开发效率。因此,对于工业控制的...

    Delphi 仪表控件Abakus

    《Delphi 仪表控件Abakus:打造专业级用户界面》 在软件开发领域,尤其是在工业、工程或数据分析相关的应用中,具有专业外观和功能的仪表控件是不可或缺的元素。Delphi作为一款强大的Windows应用程序开发工具,其...

    delphi7系列优秀控件- XPMenu for delphi7

    本文将深入探讨XPMenu控件的特性和使用方法,以及如何将其集成到Delphi7项目中,以帮助开发者充分利用这一资源。 XPMenu控件的核心功能在于提供与Windows XP操作系统一致的菜单样式和交互体验。在Windows XP时代,...

    delphi RC5.0控件

    总的来说,Delphi RC5.0控件为Delphi开发者提供了一套强大的工具,能够帮助他们构建功能丰富、视觉吸引力强的应用程序,提高开发效率,同时也增强了最终用户的使用体验。在实际开发过程中,合理利用RZ控件的特性,...

    delphi如何安装控件

    通过遵循这些步骤,您可以成功地在Delphi中安装和使用各种控件,从而丰富您的应用程序功能,提高开发效率。记得在安装过程中仔细阅读控件的文档,因为某些控件可能需要特定的设置或配置才能正常工作。

    delphi htmledit html编辑控件

    Delphi HTMLEdit是一款在Delphi编程环境中使用的HTML编辑控件,它为开发者提供了一种类似于JavaScript中的FCKEditor的强大工具,用于在Windows应用程序中创建和编辑HTML内容。这款控件设计精良,操作简便,使得开发...

    Delphi7.0皮肤控件

    本主题聚焦于如何在 Delphi 7.0 中使用第三方皮肤控件来增强应用程序的外观和用户体验。 首先,皮肤控件是一种能够改变应用程序界面视觉风格的组件,它们提供了丰富的自定义选项,让开发者可以轻松地调整控件的外观...

    delphi图形选择控件

    在Delphi编程环境中,开发图形用户界面(GUI)时,我们常常需要使用各种控件来增强用户的交互体验。"delphi图形选择控件"是指一类特殊的控件,它们允许用户通过图形化的界面来做出选择,比如从一组图片中选择一个。...

    Delphi SCOMM串口控件

    在本文中,我们将深入探讨这个控件的安装过程、使用方法以及它在Delphi开发中的重要性。 首先,让我们来了解什么是**SCOMM串口**。在计算机硬件中,串行端口(Serial Port)是一种用于连接外部设备的传统接口,如...

Global site tag (gtag.js) - Google Analytics