高手请进-调用VB控件的问题

greenxiar 2004-01-07 05:43:22
按照borland的说法和Delphi中广告词,Delphi应该能运行大量的VB控件。但事实上我在Delphi6,7中调VB编写的ActiveX Control遇到了无法解决的问题。

比如VB编写的(最简单的)基于ListView的一个控件,导入Delphi后运行,发现键盘消息被特别过滤了,结果是很可笑的ListView不能通过键盘上下移动光带。测试控件事件,ListView_KeyDown能正常接收到普通的abcd字符,但Up, Down, PageUp, PageDown统统都被处理掉不见了(与之对比,Mouse事件好像还很正常)。

我现在的项目是有大量的VB遗留代码,都用COM Automation和控件方式作了封装。只希望Delphi能正常调用VB控件。那位Delphi高手遇到过这种情况?在下急切等待您的指点!

急急急

在线等待答案
...全文
64 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
commars 2004-09-26
  • 打赏
  • 举报
回复
UP!
GodBirdFlying 2004-03-25
  • 打赏
  • 举报
回复
帮你up
greenxiar 2004-01-09
  • 打赏
  • 举报
回复
真的无高手吗
greenxiar 2004-01-09
  • 打赏
  • 举报
回复
谢谢 pandaohua(雨痕), 我已经注意到导入TLB的问题。不知你是否在Delphi中用过含ListView 的 VB 控件?只有鼠标起作用,键盘操作无效。你能试一试吗?

如果这个方法行不通,VB 程序员和 Delphi 程序员很难协同操作一个项目,这是个大难题啊!
pandaohua 2004-01-09
  • 打赏
  • 举报
回复
Delphi5
一个手工修改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,编译即可,这样在调用控件的方法时便不会出现上述的致命错误。



如果你在VB的用户控件中使用类似Frame和PictureBox这样的容器控件(其内部可以包含其他控件)时,那么您将不可以在这些控件中添加Label、Line、Image这样的windowLess控件(也就是无窗口控件,它们在运行时是VB实时画出来的),否则您就会得到上面这样的错误报告。





Delphi 6、7

点击Tools菜单->Environment Options->Type Library页,我们应该发现一项:Ignore special CoClass Flags When Importing,选中它,然后再选中Can Create那一项,那么现在,我们再尝试去导入那个可怜的ActiveX控件吧(这里要注意,如果你已经导入过一次,那么请把产生的那两个文件 .dcr 和 .pas文件删除,否则将不会刷新)。这次如果还是不能在ActiveX栏中发现那个控件的话,那么只有致电Microsoft或是Borland,问问看什么时候它们能结成亲家,呵呵!



(另,在Delphi6和7中倒是没有发现Delphi5中出现的上述错误)



我的测试环境是:

Win2K

Delphi 5 Update1

Delphi 6 Update2

Delphi 7


希望对你有所帮助!

zth215 2004-01-07
  • 打赏
  • 举报
回复
没有遇到过
帮顶

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧