假设同一个工程内,有以下文件:TestClass.cls -> 测试类
HostClass.cls -> 宿主类
HostControl.ctl -> 宿主用户控件
MainForm.frm -> 主窗体HostClass 和 HostControl 有同样一个函数:
'返回一个TestClass类型的数组
public function GetArray() as TestClass()
    dim ret() as TestClass
    redim ret(2) as TestClass
    set ret(0) = new TestClass
    set ret(1) = new TestClass
    set ret(2) = new TestClass
    GetArray = ret
end function
MainForm 窗体中放置一个 HostControl 控件 进行如下测试:
Private Sub Command1_Click()    dim x() as TestClass
    dim y() as TestClass    dim MyHostClass as HostClass
    set MyHostClass = new HostClass    ' 该代码执行成功,x 正确获取 TestClass 数组
    x = MyHostClass.GetArray()    ' 该代码执行失败! 提示:不能为数组赋值。
    y = HostControl1.GetArray()end sub
为何同样一个函数写在用户控件里就编译错误?请求各位大虾指点同样一个类似疑问:如果将TestClass数组作为一个函数的参数,外部调用时用户控件中的代码就会提示类型不符,类中却正常。另外,如果在相关代码上按 Ctrl+I 键弹出代码提示, MyHostClass.GetArray() 显示返回类型为 TestClass() 正常,HostControl1.GetArray() 显示返回类型为 _TestClass() 为什么多出一个下划线?其他不涉及数组返回TestClass实例的函数也会提示返回类型为_TestClass,却不影响使用。

解决方案 »

  1.   

    这种应用对于控件不能返回自定义类,只能用Object对象作为接口,
    控件里你可以改成这样:public function GetArray() as Object()   '该这里的类型
        dim ret() as Object                  '该这里的类型
        redim ret(2) as TestClass
        set ret(0) = new TestClass
        set ret(1) = new TestClass
        set ret(2) = new TestClass
        GetArray = ret
    end function测试这样Private Sub Command1_Click()    dim x() as TestClass
        dim y() as Object     '该这里的类型
        dim MyHostClass as HostClass
        set MyHostClass = new HostClass    ' 该代码执行成功,x 正确获取 TestClass 数组
        x = MyHostClass.GetArray()    ' 该代码执行失败! 提示:不能为数组赋值。
        y = HostControl1.GetArray()end sub
      

  2.   

    redim ret(2) as TestClass
    改成这样
    redim ret(2)
      

  3.   

    这个应该使用控件接口向导来做吧
    经常看到这个:
    '注意!不要删除或修改下列被注释的行!
    'MemberInfo=0
      

  4.   


    使用Object的确可以解决问题,但同时也失去了代码智能提示。1、为什么只有控件会发生该错误,而类里同样的函数却可行?2、控件里引用自定义类时,类名前会自动加一个下划线?
      

  5.   

    这和 COM 接口有关,ActiveX 是标准的 COM 接口的,所以只能使用通用的 COM 接口类型
    来传递参数,非标的东西是不符合 COM 标准的,所以不能直接传递,这就是为什么不能用自
    定义类对象传递问题的根本。
      

  6.   


    用户控件生成OCX可以被其它程序使用,自定义类生成DLL也可以被其它程序使用,该OCX和DLL应该都符合COM标准才对,为何只有OCX不支持非标自定义数组赋值?实验发现通过下面的函数却可以变通处理'利用Variant类型给数组赋值
    Public Sub SetArray(Target() As Class1, Source)
        Target = Source
    End Sub'出错的代码改成如下,便可正常传值,说明GetArray的确已经返回Class1数组类型的数据
    SetArray y, HostControl1.GetArray()这又是为什么呢?^_^
      

  7.   

    工程区别,你可以观察一下标准EXE的类模块和 ActiveX DLL 和 ActiveX 控件 的类模块属性是不一样的。