2013-12-19 63 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