没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2007-08-17 10:35:22.000|阅读 1431 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
在最近几周的工作里,始终被一个头疼的问题所困扰,那就是 VB6 编写的 ActiveX 控件在 Delphi 环境下存在着诸多稀奇古怪的问题,几经周折,终于在搜索了几乎全部的论坛、资料后,找到了针对不同 Delphi 版本发生的问题的解决办法。
首先,我们来看看 VB 写的 ActiveX 控件在 Delphi 5下面的奇怪表现。
例如:我们用VB编写了一个控件 UserTest(为简单起见,我们只导出一个类即用户控件),一个属性 TestName,一个方法 TestMethod。然后将其编译成一个 ActiveX 控件,注册并导入 Delphi5的开发环境(以上步骤如有未清楚之处,请查阅各类参考资料,肯定有标准答案),到目前为止,看来一切正常。
然后,我们习惯的把控件拖放到窗体上,调整大小,在属性窗口中为属性赋值,或者在代码中也是一样,非常正常,好用的很。但是,下面问题来了,如果您兴致勃勃的去调用了那个 TestMethod,那么您将得到一个古怪的异常 “Ole Error
当我第一次碰到这个问题的时候,我几乎是愤怒的,因为无论是 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 没有在我绕开这个限制之后而放过我,很快,客户那边发现另一个麻烦的问题,在开发环境下,每次运行时关闭载有控件的窗体都会跳出一个异常错误,但是在编译后的应用程序中则不会,虽然不会影响最终用户的使用,但是这对开发人员来说是个不小的困扰,然后我用了上述例子去试,发现并不会发生这个问题。(我当时就疯了,这很可能是代码中一些不兼容的用法所致,在一天时间里查找上万行代码是不是很正规是件极其恐怖的事情)我一气之下,屏蔽了我的控件中所有的代码,只留下用户界面本身,然后奇怪的事情发生了,我什么代码都没写,但是加载我的控件还是会发生这个错误,这使我又喜又惊,喜的是这个问题和我的代码无关,这样查找起来会方便的多;惊的是只是拖放几个 VB 中的标准控件居然也会造成这种恐怖的错误,Delphi5 和 VB6 之间的矛盾还真不是一般的深。接下来的2个小时里,我不断地删除界面上的控件来测试到底是谁造成了这个致命的异常。
2个小时后,我舒了一口气,问题找到了, 其根本问题是:
如果你在 VB 的用户控件中使用类似 Frame 和 PictureBox 这样的容器控件(其内部可以包含其他控件)时,那么您将不可以在这些控件中添加 Label、Line、Image 这样的 windowLess 控件(也就是无窗口控件,它们在运行时是 VB 实时画出来的),否则您就会得到上面这样的错误报告。
正是因为有了 Delphi5 下面的恐怖经历,我发现还是很有必要在 Delphi6 和7下面测试是不是也存在同样的问题(之前的版本因为用户极少已无必要,Delphi8 还没正式出,也暂不在考虑之列)。结果是:……无论我加载多少次,我在 ActiveX 栏上始终没有发现那个期待已久的小图标。这样的结果当然很滑稽,我连加载都做不到,更不要谈什么测试正常不正常了。
同样的,我搜索各类论坛和网站,CSDN 里我也发现了更多的类似问题的提出者,但答案还是零,无奈之下,我只好对每个 Delphi6、7中的选项进行调整……
历时3小时15分54秒后,我找到了这个该死的问题(请原谅我这么称呼它,我实在是忍无可忍)的原因,或者说是解决办法,说起来其实很简单。
现在请跟着我做:点击 Tools 菜单->Environment Options->Type Library 页,我们应该发现一项:Ignore special CoClass Flags When Importing,选中它,然后再选中 Can Create 那一项,那么现在,我们再尝试去导入那个可怜的 ActiveX 控件吧(这里要注意,如果你已经导入过一次,那么请把产生的那两个文件 .dcr 和 .pas 文件删除,否则将不会刷新)。这次如果还是不能在 ActiveX 栏中发现那个控件的话,那么只有致电 Microsoft 或是 Borland,问问看什么时候它们能结成亲家,呵呵!
(另,在 Delphi6 和7中倒是没有发现 Delphi5 中出现的上述错误)
我的测试环境是:
Win2K
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:csdn面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号