如何在标准模块中,调用自定义控件中的函数??我将函数声明成Friend,不行。
Friend Function foo()
End Function
在标准模块中这样调用
call Usercontrol.foo(),编译时出现错误:变量未定义。应该怎么办呢?

解决方案 »

  1.   

    如果你在模块中定义的函数,而且没有返回值,那么在模块中调用的话不需要有括号Friend Function foo()
      ........
    End FunctionFriend Function dy()
      foo
    End Function
      

  2.   

    调用者必须拥有控件的一实例才能调用。
    你可在模块调用方法,多传一个控件引用进去public test(byref oCtl as 控件)
        ......
        call oCtl.foo()
        ......
    end function
      

  3.   

    而且VB里面有Friend吗?即便有,这里也不存在友元这个概念
      

  4.   

    谢谢你的回答,但是问题不是出现在这个地方,而是在标准模块中不能调用在自定义控件中定义的函数。直接调用就出现:过程或函数未定义错误。在函数名前面加上“Usercontrol.”又出现变量未定义错误。
      

  5.   

    而且VB里面有Friend吗?即便有,这里也不存在友元这个概念
    ----当然有啦。的确不是友元的概念。只是标示了调用函数的范围是:同一个工程内可以访问。这个范围介于public和private之间。
      

  6.   


    call Usercontrol.foo(),编译时出现错误:变量未定义。应该怎么办呢?可能是因为你的函数没有返回值 , 你可以直接调用 Usercontrol.foo
      

  7.   

    Friend      修改窗体模块或者类模块中的一个过程的定义,使得该过程可以被类外的模块调用,但必须是在定义该类的工程的部分内。Friend 过程在标准的模块中是不能使用的。______________________________________________________________________嗯,以前没用这个东西,今天学到,呵呵
      

  8.   

    ...胡说了 可以访问吗自定义控件中的函数吗>?  我不知道.....多处用他 为什么不把他放到mod里
      

  9.   

    谢谢各位捧场,呵呵。我把问题的来源说说,问题已经解决了。和大家分享一下:
    我想在vb中做一个可以编辑subitem的listview控件。在这个地方找到一个很好的例子:Brad Martinez, http://www.mvps.org。他给textbox写了一个新的窗口函数,去响应WM_Killfocus消息。这个新的窗口函数必须定义在标准的模块中,因为是这样用的 :
    Call SubClass(Text1.hWnd, AddressOf WndProcForText)
    由于要使用:AddressOf ,所以必须定义在普通模块中,但是在WndProcForText中,我又要调用一个自定义控件中的函数。如果是普通的工程,很好解决,直接写:frm***.foo ,就可以调用了。但是自定义控件模块工程中这样写: usercontrol.foo.是不行的。原因就是编程人生说的。但是,“多传一个控件引用进去”也是不行的,因为窗口函数的参数个数是固定的,不能传了。
      

  10.   

    接着写:
    后来绕了个弯子算是解决了。通过SetProp (API),把Listview的窗口句柄作为textbox的窗口属性存起来,在WndProcForText窗口处理函数中,用SetProp 得到listview的窗口句柄,并向listview发送WM_SETFOCUS消息,于是,textbox的LostEvent事件产生了。然后在控件模块中,响应textbox的lostevent事件,这样就可以调用foo啦。
    乱糟糟写了一堆,不知道有没有写清楚。
    类似的问题用google搜了一下,也有老外问过,不过最后都没有答案。
    我这样做,感觉也挺麻烦的。有没有谁还有更好的方法,请赐教。谢谢。
      

  11.   

    写错了一个地方:用SetProp 得到listview的窗口句柄--应该是用GetProp函数
      

  12.   

    你为何非得用对TextBox子类来处理呢?如果不用子类的话,当然就不存在调用问题你使用子类无非就是要响应WM_Killfocus,然后调用Foo将TextBox值修改SubListitems值,
    直接使用TextBox的LoseFocus事件,在其中调用Foo难道不行吗?!
      

  13.   

    lostfocus事件和WM_KillFocus是不一样的。为了达到更好的效果,所以才去处理WM_KillFocus消息。他们的区别是: its LostFocus event it not fired when losing focus to a window outside the app.这是那个源程序的注释。我做过试验的,如果不响应WM_KillFocus,在listview所在的对话框之外进行鼠标操作时,lostfocus事件是不会发生的。