请教各位高手:
    多个窗体调用Module的同一函数时, 如何在函数得到调用源的Form对象?
注: 直接取得,不通过传递Me对象.

解决方案 »

  1.   

    搞反了,是Form在调用Module的函数,函数是静态的,被动的等着调用而已,它根本就不知道Form的存在,不管有没有Form实例存在,函数都是不变的,怎么可能直接取得调用它的Form呢?Form在调用函数时把自身传进去是唯一的办法~
      

  2.   

    你的不通过传递Me对象,是不是这个意思,即不能有frm As Form?
    Public Function add(frm As Form)
    MsgBox frm.Caption
    End Function
      

  3.   

    传formname是最好的办法了。如果每次都是正在使用的窗体的话,可以在每个form打开时先设定窗体名。
    例如左右结构的时候,点左边导航栏时,将打开的窗体名赋给一个变量,函数每次只用判断这个变量就可以了。
      

  4.   

    Public Function fun(frm As Form)
       ..
    End Functionform里调用函数时这样写:private sub form_load()
       fun me
       ...
    end sub
      

  5.   

    模块中写:
    Public Sub CallFrom(frmCur As Object)
       frmCur.Hide
    End Function窗体中写:
    Option ExplicitPrivate Sub Command1_Click()
        CallFrom Me
    End Sub
      

  6.   

    多谢各位积极参与,
    难道必须
      将form 作为参数传于,
      或传标志字符串
    两种方法,才能在模块的函数中使用原窗体对象,设定其visiable属性。
    我因为是对以前函数改照,地方较多,想只修改共同函数。
    所以,有没类似指针,或得到当前程序活动窗体的方法?
      

  7.   

    两个方法.
    方法1.在你的函数中用Optional加多一个参数,
    例如你以前的函数是:
    public function abc(msg as string) as string
    你就改为 public function abc(msg as string,Optional myform as form) as string
    这样的话,你加的这个参数就是可选的了,你以前用用一个参数也可以调用,不用改以前的调用方法了
    方法2.
    在模块中定义一个全局量,如:public myform as form然后在所有窗口的Activate事件中写代码.
    Private Sub Form_Activate()
    myform = Me
    End Sub
    ,这样的话,你每次调用的那个myform 就是当前的活动窗口了
      

  8.   

    楼上说的两种方法也试过,但还有些问题,后来就放弃了,还望具体指点: 
    方法1 还是要传参数的,但函数内如何判断,该参数传了没有,如没有设定默认窗体
    方法2 使用时出错,Frmform = Me 说该方法使用不当
      

  9.   

    1.Public Function abc(msg As String, Optional myform As Form)
    If myform Is Nothing Then
        msgbox "没有"
    Else
        MsgBox myform.Name
    End If
    End Function
    2.要这样.
    set Frmform = Me
      

  10.   

    模块中这样写
    Public Sub SubFrom(WinFrom as Object)
       Msgbox WinFrom.Name
    End Function窗体中写:Private Sub Command1_Click()    SubFrom Me '
       或者
       dim frm as From1
       set frm=new from1
       call frm
    End Sub