Eval function vb.net

  • Thread starter Thread starter Maurice
  • Start date Start date
M

Maurice

Hi,

is it possible to enter a string in code in VB.NET 2005 which will be
executed as a codeline during runtime?

i.e. I want to declare a new form depending on the string:
"Dim frm as new frmTest"


Thanx
 

Hi Armin,

I have 2 different forms inside my project:
frmTest
frmCompany

I can declare a new form by using the code:
dim frm as new frmTest
OR
dim frm as new frmCompany

What I want is that when I have a string with the form name (strFormName) I
can use this string to declare the new form.

strEval = "Dim frm as new " & strFormName

Something like this. So the string above (strEval) will be executed as a
line of code.
 
Maurice said:
Hi Armin,

I have 2 different forms inside my project:
frmTest
frmCompany

I can declare a new form by using the code:
dim frm as new frmTest
OR
dim frm as new frmCompany

What I want is that when I have a string with the form name
(strFormName) I can use this string to declare the new form.

strEval = "Dim frm as new " & strFormName

Something like this. So the string above (strEval) will be executed
as a line of code.


Creating an object by class name has been asked three times in a row, that's
why I pointed to the previous two questions and answers.

Why do you have the class name in a string? Often this is not necessary:

Dim frm as form

select case value
case This
frm = new frmTest
case That
frm = new frmCompany
end select

frm.show


Armin
 
Creating an object by class name

Hi Armin,

sorry, indeed creating an object by class name.

It's possible that in future some names may change and I don;t want to
change this function then. That's why I don't want a select case statement
to declare a new form.

But isn't there something like the Eval function in VBScript that you can
use?

i.e.:
Dim intA as integer, intB as integer, intC as integer

intA = 5
intB = 10
Eval("intC = intA * intB")

The string value "intC = intA * intB" would then be executed as code and
intC would have the value 50.
 
Look into Activator.CreateInstance(). This has been asked before. Do a
search for more detailed examples.
 
Hi Maurice

Here is something I use

<code>
Public NotInheritable Class Evaluator

Private Shared WithEvents m_ScriptControl As
MSScriptControl.ScriptControlClass

Shared Sub New()

m_ScriptControl = New MSScriptControl.ScriptControlClass

m_ScriptControl.Language = "VBScript"
m_ScriptControl.AllowUI = False

End Sub

Public Shared Function Evaluate(ByVal s As String, ByVal decimalPlaces
As Integer) As Double

Return Decimal.Round(Convert.ToDecimal(Evaluate(s)), decimalPlaces)

End Function

Public Shared Function Evaluate(ByVal s As String) As Double

Dim r As Double

m_ScriptControl.Reset()

' Example of executing code
''m_ScriptControl.ExecuteStatement("Dim m")
''m_ScriptControl.ExecuteStatement("m = 5")

' Example of manipulating a form
''m_ScriptControl.AddObject("DotnetForm", Me)
''m_ScriptControl.ExecuteStatement("dotnetform.width =
dotnetform.width + 10")

Try
r = CDbl(m_ScriptControl.Eval(s))

Catch ex As Exception
Dim ee As EvaluationException

ee = New EvaluationException(ex.Message)

ee.Description = m_ScriptControl.Error.Description
ee.Column = m_ScriptControl.Error.Column
ee.Number = m_ScriptControl.Error.Number
ee.Source = m_ScriptControl.Error.Source
ee.Text = m_ScriptControl.Error.Text

Throw ee

End Try

Return r

End Function

End Class
</code>

I call Evaluator.Evaluate(...) with a string that I want to evaluate,
optionally with a number of decimal places. EvaluationException is my custom
exception class, but you could make up your own.

HTH

Charles
 
Charles,

Do you mind if I test your class and than set it on our (VB-Tips) website,
this was in my opinion as well the way to go and I was intended to try it
some day.

(With telling who it made of course)

Cor
 
Hi Cor

Yes, indeed. It is neat enough to demonstrate the idea, and people can add
frills as they wish.

Charles
 
Back
Top