比如我有一个窗体,里面有不同的过程,如:
sub1,sub2,sub3在另外一个窗体,我要设置一个变量,如L,令L=sub1(sub2,sub3)
然后,调用不同的过程call L
不知道用什么方法能实现了?请高手指教!

解决方案 »

  1.   

    不明白什么意思
    什么叫“call L”?变量不能call的
    楼主再解释一下吧
      

  2.   

    楼主是不是要做类似于C里面的函数指针那样的操作?
    VB似乎不支持这么干
      

  3.   

    可以通过Script Control来完成,假设在工程中有Form1 Form2两个窗体,在Form2中有以下过程:
    Public Function sub1(i As Integer, b As Integer) As Integer
        sub1 = i + b
    End FunctionPublic Function sub2() As Integer
        suub2 = 2
    End FunctionPublic Function sub3() As Integer
        sub3 = 5
    End Function在Form1中添加Script Control后可以通过以下代码:
        Dim shar As New Form2
        
        ScriptControl1.AddObject "sh", shar
        
        ScriptControl1.AddCode "Function Main()" & _
            " Main = sh.sub1(sh.sub2, sh.sub3)" & vbCrLf & "End Function"    MsgBox "结果等于:" & ScriptControl1.Run("main"), , "运算结果"
    获得sub1(sub2, sub3)的结果
      

  4.   

    这个代码已经上传到我的群组,可以到:
    http://disk.csdn.net/group/AppleVB/
    查看下载,
      

  5.   

    根据不同情况调用不同函数,一般使用 if...then 或 select 语句,没必要复杂化。
      

  6.   

    用Call...?变通的办法:可以把sub1,sub2,sub3放到bas或class中,然后调用。
      

  7.   

    我现在是想通过一句程序call L
    其中:L为变量,
    实现当l=“sub1”时, 调用call sub1()
    当l=“sub2”时,调用call sub2()
    当l=“sub3”时,调用call sub3()
    不知道能不能实现啊???
      

  8.   

    TechnoFantasy((VB MVP)www.applevb.com)你的方法是调用不同的过程,谢谢了!
    不过我要求的是通过变量调用不同的过程~见上楼所讲!
      

  9.   

    如果一定要这样做是能实现的,要用到 CallWindowProc 函数,AddressOf 运算符。可以参见VB《真是想不到》系列的文章。
      

  10.   

    http://msdn2.microsoft.com/en-us/library/y72ewk2b(VS.80).aspx
      

  11.   

    iamxiang(真心微笑) ( ) 信誉:101 Blog   加为好友  2007-6-11 15:54:49  得分: 0
    我现在是想通过一句程序call L
    其中:L为变量,实现当l=“sub1”时, 调用call sub1()
    当l=“sub2”时,调用call sub2()
    当l=“sub3”时,调用call sub3()
    ---------
    只要
    SELECT CASE L
      CASE "SUB1":CALL SUB1
      CASE "SUB2":CALL SUB2
      CASE "SUB3":CALL SUB3
    END SELECT
      就好了. 代码越普通越正规,越"特别"越失败.初学者切忌此误区.
      

  12.   

    to:TechnoFantasy((VB MVP)www.applevb.com) 
    过程是写在字符串里面,可是改成过程之后就不支持了!提示,没有此方法~
    你也可以自己调试一下!
      

  13.   

    如果你只是普通的根据不同变量值调用不同方法,而不需要执行类似sub1(sub2,sub3)这样灵活调用的话,直接使用theforever(碧海情天) 的代码就可以了。
      

  14.   

    同意 碧海情天 的做法,用select case 就可以搞定了,没有必须弄那么复杂。
      

  15.   

    我上面的方法本着越普通越好的原则.
    如果觉得函数多的情况下,SELECT CASE 写得行数多,看着笨,可以用下面方法(感觉有点水平的样子,可我觉得不好).Public Function Root(ByVal X As Single)
        Root = Sqr(X)
    End FunctionPublic Function Square(ByVal X As Single)
        Square = X * X
    End FunctionPublic Function Triple(ByVal X As Single)
        Triple = 3 * X
    End Function上面是三个函数了,也可以更多,也可以是过程.
    下面函数可以根据一个字串变量参数来调用想调用的函数过程.Private Sub 调用我想调用的函数(theFuncName as String,需要传递的参数 AS STRING)
        me.Caption = Format$( CallByName(Me, theFuncName , VbMethod, 需要传递的参数))
    End Sub
      

  16.   

    楼上的,说谢谢你是感谢你的热情!不过你的回答可和我要问的问题有出入~
    jiangsheng(蒋晟.Net[MVP])  利用addressof的方法我试过了!
    不过此方法只能调用dll中的函数,和我要的还是不一样~
    能不能再想想办法,因为如果能够实现,那就可以用来实现智能程序了~
      

  17.   

    能不能再想想办法,因为如果能够实现,那就可以用来实现智能程序了~
    ===============================================================
    这个用VFP等解释执行的语言很容易实现,
    要不干脆换一种语言好了
      

  18.   

    theforever(碧海情天),说实话,你的热情我还是赞赏的,只是,不要太先入为主!不要总以老师对学生的口气说话,不太好~那么多牛人都不像你~请高手们帮忙想想吧~
      

  19.   

    另外:再解释一下我的问题:比如我有一个窗体,里面有不同的过程,如:
    sub1,sub2,sub3现在,我希望利用一个变量L,l=re![执行过程].(re![执行过程]是表中的字段。re![执行过程]可以是"sub1"或者"sub2"或者"sub3"
    程序里面:
    call L
    开始写的时候l=sub(sub2,sub3)可能引起了调解,以为我是想要用回调过程,不好意思~
    请高手们再帮忙想想办法!!!
      

  20.   

    Private Sub Command1_Click()
        Dim L As String
        L = "sub1"
        CallByName Form1, L, VbMethod
        L = "sub2"
        CallByName Form1, L, VbMethod
        L = "sub3"
        CallByName Form1, L, VbMethod
    End SubPublic Sub sub1()
        Debug.Print Now, "Sub1"
    End Sub
    Public Sub sub2()
        Debug.Print Now, "Sub2"
    End Sub
    Public Sub sub3()
        Debug.Print Now, "Sub3"
    End Sub
      

  21.   

    我汗,我也在想用callbyname....被楼上先发了-_-!
      

  22.   

    你的sub1 sub2 sub3,这些方法带参数么?
      

  23.   

    谢谢yachong(蚜虫),这样调用单纯的无参数的过程是可以的!
    再帮忙想想:比如现在我的l="file1_click()"   
    file1_click()是指我的窗体上的一个菜单
    再比如我的sub2(m as string)是带参数的
    应该如何才能实现?谢谢啦~
      

  24.   

    callbyname可以带参数运行的MSDN里说得很清楚:CallByName 函数      执行一个对象的方法,或者设置或返回一个对象的属性。语法CallByName(object, procedurename, calltype,[arguments()])CallByName 函数的语法有以下部分:部分 描述 
    object 必需的;变体型(对象)。函数将要执行的对象的名称。 
    procedurename 必需的;变体型(字符串)。一个包含该对象的属性名称或者方法名称的字符串表达式。 
    calltype 必需的;常数。一个 vbCallType 类型的常数,代表正在被调用的过程的类型。 
    arguments() 可选的:变体型(数组)。 
    说明CallByName 函数用于获取或者设置一个属性,或者在运行时使用一个字符串名称来调用一个方法。在下面的例子中,第一行使用 CallByName 来设置一个文本框的 MousePointer 属性,第二行得到 MousePointer 属性的值,第三行调用 Move 方法来移动文本框:CallByName Text1, "MousePointer", vbLet, vbCrosshair
    Result = CallByName (Text1, "MousePointer", vbGet)
    CallByName Text1, "Move", vbMethod, 100, 100
      

  25.   

    楼主 要搞清楚“过程”和“函数”的区别,这应该是基础知识
    过程没有返回值,像你这样调用L=sub1(sub2,sub3),是不行的,因为sub2 sub3没有返回值,它们没法传给sub1值,如果 sub2 sub3是函数就可以了,因为函数一般应有返回值
      

  26.   

    我是真不知道楼主有没有搞明白 CallByName(Me, theFuncName , VbMethod, 需要传递的参数)  这句的作用,有没有试过. 然后再说说它的出入和不足.我只觉得面对楼主真是在CSDN上几年来从未感觉过的艰难.不是我说话不好听,你自己琢磨去吧.
      

  27.   

    我希望利用一个变量L,l=re![执行过程].(re![执行过程]是表中的字段。re![执行过程]可以是"sub1"或者"sub2"或者"sub3"
    程序里面:
    call L
    ------------
    没看到..... 不过还是理解不了, 看来跟楼主没法沟通.
      

  28.   

    'form1:Private Sub file1_click()
    MsgBox "file1"
    End Sub
    Sub xxxx()
    file1_click
    End Sub
    Sub sub2(m As String)
    MsgBox m
    End Sub'form2Private Sub command1_click()
    Dim l As String
    l = "xxxx"
    CallByName Form1, l, VbMethod
    l = "sub2"
    CallByName Form1, l, VbMethod, Date - Rnd * 100
    End Sub