假如程序已经生成exe文件,有一个文本框 ,我输入 command1.height=800
想通过这个语句来调整command1控件的属性height=800有什么方法可行吗?我一直找不到方法。就是不知有没有什么办法在工程生成exe文件后还能让工程读懂vb语句。像数据库查询语句还有一个execute命令可以运行如“select * from aaa” 等等形式的语句,但执行vb原码好像没有接口,不知高手有没有办法。
有的朋友说可以用翻译软件的原理,但那翻译方式是带词库,当输入口得到一个语句或词时就查词库再将翻译结果用一种方式显示出来。而我的意思是让VB生成的EXE文件能读懂VB语句,即在程序内部不预置任何扫描类的条件,就用一个方法来运行输入的VB语句。如设置一个文本框为VB语句的入口,(生成好的EXE文件)将VB原代码如"command1.left=450"填在文本框,再点按一个回车就解释运行这个语句,将command1控件的左边位置移到450的地方。应当能行,这属于解释再运行方式,只是这种方法可能并不公开,不知各位有何良策。

解决方案 »

  1.   

    '给你一些函数和过程:
    '调用 ExecuteCode 过程strCode为你要执行的语句!Private Function GetObjByName(ByVal strName As String) As Object
        Dim obj As Object
        
        For Each obj In Me.Controls
            If obj.Name = strName Then
                Set GetObjByName = obj
                Exit Function
            End If
        Next
    End FunctionPrivate Function GetObjName(ByVal strCode As String) As String
        Dim lP As Long
        
        GetObjName = ""
        lP = InStr(1, strCode, ".")
        If lP > 0 Then
            GetObjName = Mid(strCode, 1, lP - 1)
            Exit Function
        End If
    End FunctionPrivate Function GetObjPropertyName(ByVal strCode As String) As String
        Dim lP1 As Long, lP2 As Long
        
        GetObjPropertyName = ""
        lP1 = InStr(1, strCode, ".")
        If lP1 > 0 Then
            lP2 = InStr(1, strCode, "=")
            If lP2 > 0 And lP2 > lP1 Then
                GetObjPropertyName = Mid(strCode, lP1 + 1, lP2 - lP1 - 1)
                Exit Function
            End If
        End If
    End FunctionPrivate Function GetObjPropertyValue(ByVal strCode As String) As String
        Dim lP As Long
        
        GetObjPropertyValue = ""
        lP = InStr(1, strCode, "=")
        If lP > 0 Then
            GetObjPropertyValue = Mid(strCode, lP + 1)
            Exit Function
        End If
    End FunctionPrivate Sub ExecuteCode(ByVal strCode As String)
        Dim obj As Object
        Dim strObjName As String
        Dim strObjPName As String
        Dim strObjPValue As String
        
        strObjName = GetObjName(strCode)
        strObjPName = GetObjPropertyName(strCode)
        strObjPValue = GetObjPropertyValue(strCode)
        Set obj = GetObjByName(strObjName)
        Call SetObjProperty(obj, strObjPName, strObjPValue)
    End SubPrivate Sub SetObjProperty(obj As Object, ByVal strPN As String, ByVal strPV As String)
        Select Case LCase(strPN)
                Case "left"
                    obj.Left = strPV
                Case "top"
                    obj.Top = strPV
                Case "width"
                    obj.Width = strPV
                Case "height"
                    obj.Height = strPV
                Case "text"
                    obj.Text = strPV
                Case "backcolor"
                    obj.BackColor = strPV
                '还有其它属性,你自己添吧,太多了!
        End Select
    End Sub
      

  2.   


    command1.left=val(text1)
    行了吧
      

  3.   

    感谢rick110AAA的答复,不过我想看是不是有更简单点的方法,这个原理实际上是字典式的。sql查询语言只需调用execute方法就可以实际查询语句的功能,而VB难道就不能像SQL查询语句一样方便吗?再有这是设置控件的属性可以用字典式,但如果新装一个控件的语句就无能为力了,如我在入口填入 load text1(index) 那么就无法用上面的方法来搞了,是不,也就是说并不是VB解释编译运行的,而是预存的扫描类的条件进行处理的,对不?不知有无高手更有良策啊
      

  4.   

    楼主可以试着使用
    你可以使用microsoft script Control控件 ,简单示例:新建工程
    Private Sub Command1_Click()
    ScriptControl1.Run "B1_click"
    End SubPrivate Sub Command2_Click()ScriptControl1.AddCode Text1.Text
    ScriptControl1.Run "Main"
    End SubPrivate Sub Form_Load()
    Label1.Caption = "用下面的 picturebox 扮演 form1做演示"
    Label4.Caption = "要执行的代码"
    Text1.Text = "Sub Main()" & vbCrLf
    Text1.Text = Text1.Text & "Form1.BackColor = vbWhite" & vbCrLf
    Text1.Text = Text1.Text & "End Sub" & vbCrLf
    Text1.Text = Text1.Text & "" & vbCrLf
    Text1.Text = Text1.Text & "Sub B1_click()" & vbCrLf
    Text1.Text = Text1.Text & "b1.Caption = " & Chr(34) & "clicked" & Chr(34) & vbCrLf
    Text1.Text = Text1.Text & "MsgBox " & Chr(34) & "B1CLICKED" & Chr(34) & vbCrLfScriptControl1.AddObject "form1", usrfrm
    ScriptControl1.AddObject "b1", Command1
    End Sub
    写的可能不大清楚如果不明白给我发消息我给你例子代码
      

  5.   

    补充
    控件文件名为msscript.ocx
    另外我上面的代码有误你只要了解他的机制就可以
    参考
    SCRIPTEX.EXE Uses the ScriptControl with Visual Basic(msdn的例子)
    http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q189/4/84.asp&NoWebContent=1
    HOWTO: Call Functions Using the Script Control(说明及例子)
    http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q184/7/40.asp&NoWebContent=1
      

  6.   

    属性能使用字典,其它还不是可以,只是代码较复杂!
    使用Microsoft script control 是一个简单的好方法!
      

  7.   

    rick110aaa你可以提供一些这样的例程给我吗?谢谢
      

  8.   

    Option Explicit
    Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPublic Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
        ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0
    End FunctionPrivate Sub Command1_Click()
        ExecuteLine "msgbox (1+2)*3/4"
        ExecuteLine "dim a as integer"
        ExecuteLine "a = 10"
        ExecuteLine "Print a"
        ExecuteLine "form2.show"
    End Sub看看这个能不能达到你的要求~~
      

  9.   

    另外,callbyname这个函数也能实现很多"运行时解释执行"的功能,查查msdn吧,会有意外收获