...时错误(0x800A01B6)-->对象不支持此属性或方法怎么解决,急去、需...
发布网友
发布时间:2024-03-06 21:50
我来回答
共1个回答
热心网友
时间:2024-06-13 14:17
并非所有对象都支持所有属性和方法。此错误有以下原因和解决方法:
1.指定的方法或属性在 Automation 对象中并不存在。
参看对象的文档以获得此对象更多的信息,并检查属性和方法的拼写应正确。
2.指定 Friend 过程做为被调用的后期绑定。
在编译时间必须知道 Friend 过程的名称,它不能出现在后期绑定的调用上。
========================
参考资料MSDN
关于对象和接口的简要补充讨论
本主题,将完成从“创建和实现接口”开始,并在“实现属性”中继续讨论的那个代码示例。当然,在开始这个主题之前,阅读一下那些主题是有帮助的。
这个 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 接口。
详细信息 并没有限制一定要实现为抽象接口。下面的“代码重用的许多(内部)方面”中描述了怎样实现一个接口,以及选择性地重用该接口提供的类的属性和方法。