控件接口是什么概念???

viperstorm 2006-08-24 08:21:46
我有一个ocx.可是按文档说的有个控件接口???
怎么ocx还有接口吗?????应该怎么用啊?谢谢
在线等!!
...全文
540 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
迈克揉索芙特 2006-08-25
  • 打赏
  • 举报
回复
关于对象和接口的简要补充讨论


本主题,将完成从“创建和实现接口”开始,并在“实现属性”中继续讨论的那个代码示例。当然,在开始这个主题之前,阅读一下那些主题是有帮助的。

这个 Tyrannosaur 和 Flea 代码示例,看起来似乎用接口和对象来解决很快,也很轻松。把对象的引用赋给一个对象变量,把接口的引用赋给另一个对象变量。

事实上,所有的引用都是对象的引用。对一个接口的引用也是对实现接口的对象的引用。而且,一个对象可能有多个接口,但在底层它仍然是同一对象。

在 Visual Basic 中,每个类都有一个缺省的接口,该接口具有与类相同的名字。是的,几乎都是同样的。按照惯例,在类名前加一条下划线。该下划线指明了这个接口是隐藏在类型库里的。

这样,Tyrannosaur 类就有一个缺省名为 _Tyrannosaur 的接口。因为 Tyrannosaur 同时实现 Animal,所以该类还有第二个接口(其名为 Animal)。

不过,在它的所有底层,对象仍然是 Tyrannosaur。将一个命令按钮放置到“Form1”上,并添加下面的代码:

Private Sub Command1_Click()
Dim ty As Tyrannosaur
Dim anim As Animal

Set ty = New Tyrannosaur
Set anim = ty
MsgBox TypeName(anim)
End Sub

可能期望信息框显示 "Animal",但是,事实上显示的是 "Tyrannosaur"。

查询接口
当把 Tyrannosaur 对象赋给 Animal 类型的变量时,Visual Basic 将询问该 Tyrannosaur 对象它是否支持 Animal 接口。(为此所用的方法为 QueryInterface,或者简称 QI;有时可能遇到 QI 作为动词使用。)如果回答是否定的,将会产生错误。

如果回答是肯定的,该对象将被赋给变量。只有通过这个变量 Animal 接口的方法和属性才可被访问。

类属对象变量和接口
如果将对象引用赋给类属对象变量,(如下列代码所示),将会出现什么情况?

Private Sub Command1_Click()
Dim ty As Tyrannosaur
Dim anim As Animal
Dim obj As Object

Set ty = New Tyrannosaur
Set anim = ty
Set obj = anim
MsgBox TypeName(obj)
End Sub

结果得到另一个 Tyrannosaur。现在,通过变量 obj 调用属性和方法时,得到什么接口?将下面的方法添加到 Tyrannosaur 类中:

Public Sub Growl()
Debug.Print "Rrrrrr"
End Sub

Growl 方法属于 Tyrannosaur 对象的缺省接口。在命令按钮的 Click 事件的代码中,用下面的两行代码来取代 MsgBox 语句:

obj.Move 42
obj.Growl

当运行这个工程并单击按钮时,执行将在 Growl 方法上停止,并返回错误信息“对象不支持此属性或方法”。很明显,接口仍然是 Animal。

Object 类型的变量和具有多重接口的对象一起使用时,必须记住某些事情。该变量将访问的接口是最后赋值的接口。例如:

Private Sub Command1_Click()
Dim ty As Tyrannosaur
Dim anim As Animal
Dim obj As Object

Set ty = New Tyrannosaur
Set anim = ty
Set obj = anim
obj.Move 42 '成功
obj.Growl '失败

Set obj = ty
obj.Move 42 '失败
obj.Growl '成功
End Sub

幸好,很少将这种比较慢的、后期绑定的 Object 数据类型和具有多重接口的对象一起使用。使用多重接口的一个主要原因是,通过多态可以得到前期绑定的好处。

其它接口源
Visual Basic 的类模块不是唯一的实现接口的源。可以实现类型库包含的各种接口,只要该接口支持 Automation。

如果有 Visual Basic 专业版或企业版,那么可以创建自己的抽象类的类型库。这些类型库可能在许多工程中用到,就象在《部件工具指南》中,“创建 ActiveX 部件”中的“部件设计的一般准则”中所描述的那样。

专业版和企业版在 Tools 目录都包括有 MkTypLib (Make Type Library) 实用工具。如果已经用 Microsoft Visual C++ 使用过该实用工具,就会发现这是创建接口的一条更适宜的途径。

在工程中使用接口
为了在工程中使用接口,可以在“工程”菜单上单击“引用”,打开“引用”对话框。如果类型库已经注册,那么它将出现在引用列表中,于是可以复选它。如果类型库不在该列表中,可以使用“浏览”按钮对它定位。

一旦有了对某个类型库的引用,就可以使用 Implements 来实现该类型库包含的任何 Automation 接口。

详细信息 并没有限制一定要实现为抽象接口。下面的“代码重用的许多(内部)方面”中描述了怎样实现一个接口,以及选择性地重用该接口提供的类的属性和方法。
ljk02079 2006-08-25
  • 打赏
  • 举报
回复
接口是什么
就是控件和外界交互的东东

比如常用的标签控件 如果它不给你一个Caption接口 你怎么能改变它的显示文字呢
viperstorm 2006-08-25
  • 打赏
  • 举报
回复
帮帮我吧.谢谢啦
hn123 2006-08-25
  • 打赏
  • 举报
回复

可以保证控件是没有问题的
---------------------
哈哈,才知道什么是晕。。。


-----------
www.vicmiao.com
努力就有美好时光!
viperstorm 2006-08-25
  • 打赏
  • 举报
回复
行了..原来是ocx控件给错了..唉!!结吧
viperstorm 2006-08-24
  • 打赏
  • 举报
回复
但现在的情况是我直接加入控件.然后在Form_load()里初始化控件时它说实时错误,我把程序在C#里写了一次,也是说内存出错.
可以保证控件是没有问题的.而我的调用代码也是没问题的.只是觉得没有对它的接口进行调用!@
pcwe2002 2006-08-24
  • 打赏
  • 举报
回复
控件的公用属性、方法和函数组成了他的接口。直接调用就可以了,如果你修改控件的时候改变了属性、方法或者函数的参数那么你也改变了控件的接口,控件将不能生成与原控件相兼容的控件
hn123 2006-08-24
  • 打赏
  • 举报
回复
由控件内部提供的函数,属性,方法和事件,可以由外部调用或引用.

--------------

www.vicmiao.com
努力就有美好时光!
viperstorm 2006-08-24
  • 打赏
  • 举报
回复
没人了????

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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