invoer van textbox naar functie omzetten

Status
Niet open voor verdere reacties.

famlam

Gebruiker
Lid geworden
15 okt 2008
Berichten
416
Hoe kan ik ervoor zorgen dat de tekst in een textbox als functie gezien wordt?

Dus als iemand in een textbox "3*2-1" invoert, dat hij dan 5 te zien krijgt...
 
een math-parser schrijven!

gewoon een functie die een string neemt (in dit geval, "3+5-2") en deze evalueert.
Nu ik er aan denk, heeft VB niet een ingebouwde math parser? Denk het niet, maar je weet maar nooit. VB6 iig niet, meen ik.
 
Als je VB.NET programmeert zou dit u een heel stuk verder kunnen helpen!
Dit is weliswaar in C#.NET, maar steek dat in een dll en link het aan je vb.net project
en je kan het gebruiken:

de class:
Code:
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using System.Reflection;

namespace HelpMij
{
	static class EvaluateMathExpression
	{
		private EvaluateMathExpression() {}
		
		public static double Evaluate(string math)
		{
			string sCode = MaakCode(math);
			Assembly ass = MaakAssembly(sCode);
			if (ass != null)
			{
				Type type = ass.GetType("Berekenen.MathEvaluation", false, true);                    
				return getResult(type);
			}  
			return 100/0;
		}
		
        private static double getResult(Type type)
        {
            object o = Activator.CreateInstance(type);
            double result = (double)(((double)type.InvokeMember("CalcExpression", BindingFlags.InvokeMethod, null, o, null)));
            return result;
        }
		
        private static string MaakCode(string function)
        {
            string s = "";
            s += "namespace Berekenen\n";
            s += "{\n";
            s += "public class MathEvaluation\n";
            s += "{\n";
            s += "public double CalcExpression()\n";
            s += "{\n";
            s += "return " + function + "\n";
            s += "}\n";
            s += "}\n";
            s += "}";
            return s;
        }
		
        private static Assembly MaakAssembly(string code)
        {
            CompilerParameters param = new CompilerParameters();
            param.GenerateExecutable = false;
            param.GenerateInMemory = true;

            string sTaal = CodeDomProvider.GetLanguageFromExtension(".cs");
            CodeDomProvider prov = CodeDomProvider.CreateProvider(sTaal);
            CompilerResults res = prov.CompileAssemblyFromSource(param, code);

            string errors = "";
            foreach (CompilerError error in res.Errors)
            {
                errors += error.ErrorText + "\n";
            }
            if (errors == "")
            {
                return res.CompiledAssembly;
            }
            else
            {
                MessageBox.Show(errors);
                return null;
            }
        }    
    }
}

het gebruik:

Code:
Dim Result As Double = HelpMij.EvaluateMathExpression.Evaluate(textbox1.text)

Have Fun!
 
WarnedGraph , nice one :D

--

VB.NET vertaling van de code ;)

Code:
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports System.CodeDom.Compiler
Imports System.Reflection

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Result As Double = HelpMij.EvaluateMathExpression.Evaluate("(5*3)/10")

        MsgBox(Result)

    End Sub

End Class


Namespace HelpMij
    Friend NotInheritable Class EvaluateMathExpression

        Private Sub New()
            MyBase.New()
        End Sub

        Public Shared Function Evaluate(ByVal math As String) As Double
            Dim sCode As String = MaakCode(math)
            Dim ass As System.Reflection.Assembly = MaakAssembly(sCode)
            If ass IsNot Nothing Then
                Dim type As Type = ass.GetType("Berekenen.MathEvaluation", False, True)
                Return getResult(type)
            End If
            Return 100
        End Function

        Private Shared Function getResult(ByVal type As Type) As Double
            Dim o As Object = Activator.CreateInstance(type)
            Dim result As Double = CDbl((CDbl(type.InvokeMember("CalcExpression", BindingFlags.InvokeMethod, Nothing, o, Nothing))))
            Return result
        End Function

        Private Shared Function MaakCode(ByVal [function] As String) As String
            Dim s As String = ""
            s &= "Namespace Berekenen" & Constants.vbLf
            s &= Constants.vbLf
            s &= "Public Class MathEvaluation" & Constants.vbLf
            s &= Constants.vbLf
            s &= "Public Function CalcExpression() As Double " & Constants.vbLf
            s &= Constants.vbLf
            s &= "Return " & [function] & Constants.vbLf
            s &= Constants.vbLf
            s &= "End Function" & Constants.vbLf
            s &= Constants.vbLf
            s &= "End Class"
            s &= Constants.vbLf
            s &= "End Namespace"

            Return s
        End Function

        Private Shared Function MaakAssembly(ByVal code As String) As System.Reflection.Assembly
            Dim param As New CompilerParameters()
            param.GenerateExecutable = False
            param.GenerateInMemory = True

            Dim sTaal As String = CodeDomProvider.GetLanguageFromExtension(".vb")
            Dim prov As CodeDomProvider = CodeDomProvider.CreateProvider(sTaal)
            Dim res As CompilerResults = prov.CompileAssemblyFromSource(param, code)

            Dim errors As String = ""
            For Each [error] As CompilerError In res.Errors
                errors &= [error].ErrorText + Constants.vbLf
            Next [error]
            If errors = "" Then
                Return res.CompiledAssembly
            Else
                MessageBox.Show(errors)
                Return Nothing
            End If
        End Function
    End Class

End Namespace
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan