2013-12-19 31 views
0

我想在Visual Basic中制作一个(非常简单的)图形计算器,并且我使用ScriptControl,以便用户可以输入自己的公式,它将使用eval()来获得结果。Visual Basic Sc​​riptControl不会写入变量?

Public Class Form1 

    Dim sc As MSScriptControl.ScriptControl = New MSScriptControl.ScriptControl 

    Private Sub Form1_KeyPressed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.KeyPress, Me.Load 

     sc.Language = "VBScript" 
     sc.AddObject("x", 355, True) 
     sc.AddCode("Sub setx(xvalo)" + vbCrLf + "x = xvalo" + vbCrLf + "End Sub") 

     Me.CreateGraphics.DrawLine(Pens.Black, New Point(0, 200), New Point(5000, 200)) 
     Dim eq As String = InputBox("Please enter equation:") 
     Dim y As Double = 0 
     For i As Double = 0 To 50 Step 0.01 
      sc.Run("setx", i) 
      y = sc.Eval(eq) 
      Me.CreateGraphics.DrawLine(Pens.Blue, New Point(i * 10, y * 10 + 200), New Point(i * 10 + 0.1, y * 10 + 0.1 + 200)) 
     Next 

    End Sub 
End Class 

当我运行这一点,类型x + 2甚至只是在提示框中x,我得到一个异常:NotSupportedException: Object doesn't support this property or method: 'x'

但我刚才添加X ...没有人知道如何解决这一问题?

另一个奇怪的事情:它似乎是每当我尝试编辑sc.AddCode()参数,它说COMException was unhandled

+0

快速谷歌搜索带领我到这里:http://en.kioskea.net/faq/18985-vb-evaluate-a-mathematical-expression-of-a-string,它是一个VB.NET实现你的东西需要。它可能不支持变量,但考虑它的实现方式,在其中添加它应该不是什么大问题。可能还有其他(更好的)表达评估课程/图书馆 - 只是继续搜索。 – Neolisk

+0

如果你想自己写一个,这里有一些更多的链接:http://www.codeproject.com/Articles/9519/An-expression-evaluator-written-in-VB-NET和http://www.vb -helper.com/howto_net_evaluate_expressions.html – Neolisk

+0

好的,谢谢你的回复,我会尽快试用 – nbura

回答

0

ScriptControl的,使用户可以在旧的传统控制并不是专为.NET的输入自己的方程

相反,你可以尝试使用计算方法DataTable中:

  Dim dt As New DataTable() 
      Try 
       Dim result2 As Double = CDbl(dt.Compute(ExpressionString, "")) 
      Catch ex As Exception 
       MessageBox.Show(ex.Message) 
      End Try 

使用Try块无效公式不会停止执行

它会评估嵌套圆括号以及'(((3 *(12.223 + 15)) - 7)* 21)/ 7' 。

+0

是否[it](http://msdn.microsoft.com/zh-cn/library/system.data。 datatable.compute(v = vs.110).aspx)支持任意变量? – Neolisk

+0

使用ToString方法从变量中构建字符串。但是OP要求输入整个公式不是件。 – tinstaafl