Home All Groups Group Topic Archive Search About
Author
20 Feb 2006 2:52 PM
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

Author
20 Feb 2006 3:05 PM
Armin Zingler
"Maurice" <hmoviat@nospam.nospam> schrieb
> 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"


This line is to be part of which method, class, namespace, assembly?
Maybe the answers to the 2 questions above help.

Or:  (Framework 1.1)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconemittingdynamicassemblies.asp


Armin
Author
20 Feb 2006 3:17 PM
Maurice
"Armin Zingler" <az.nospam@freenet.de> wrote in
news:uDJYz8iNGHA.3856@TK2MSFTNGP12.phx.gbl:

> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguid
> e/html/cpconemittingdynamicassemblies.asp

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.
Author
20 Feb 2006 3:56 PM
Armin Zingler
Show quote Hide quote
"Maurice" <hmoviat@nospam.nospam> schrieb
> 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
Author
20 Feb 2006 4:32 PM
Maurice
"Armin Zingler" <az.nospam@freenet.de> wrote in news:OrGv#YjNGHA.428
@tk2msftngp13.phx.gbl:

> 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.
Author
20 Feb 2006 5:30 PM
Armin Zingler
"Maurice" <hmoviat@nospam.nospam> schrieb
> "Armin Zingler" <az.nospam@freenet.de> wrote in news:OrGv#YjNGHA.428
> @tk2msftngp13.phx.gbl:
>
> > 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.

A class name usually doesn't change, and if it changes we have to change the
code. If you change a variable name you also have to change the code
accessing the variable. Reflection is not a replacement for this.

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

No.

VB.Net is not an interpreter. Source code is compiled into an executable
(IL-Code), then to native assembler code by the JIT-Compiler. Source code
has a structure. Executable commands are part of procedures. Procedures are
members of classes, and classes are contained in assemblies. That's the
structure of an application. You can not place a string into nowhere without
any context.

If you dynamically want to create an application, you must supply this
structure. That's why I provided the link in my first message, but I was
actually looking for this one:
http://msdn.microsoft.com/library/en-us/cpguide/html/cpcongeneratingcompilingsourcecodedynamicallyinmultiplelanguages.asp


Armin
Author
22 Feb 2006 9:29 AM
Charles Law
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


Show quoteHide quote
"Maurice" <hmoviat@nospam.nospam> wrote in message
news:Xns9770B2725FE78mauricemertens@194.109.133.242...
> "Armin Zingler" <az.nospam@freenet.de> wrote in news:OrGv#YjNGHA.428
> @tk2msftngp13.phx.gbl:
>
>> 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.
>
>
>
Author
22 Feb 2006 10:19 AM
Cor Ligthert [MVP]
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

Show quoteHide quote
"Charles Law" <bl***@nowhere.com> schreef in bericht
news:%23mviJK5NGHA.3196@TK2MSFTNGP09.phx.gbl...
> 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
>
>
> "Maurice" <hmoviat@nospam.nospam> wrote in message
> news:Xns9770B2725FE78mauricemertens@194.109.133.242...
>> "Armin Zingler" <az.nospam@freenet.de> wrote in news:OrGv#YjNGHA.428
>> @tk2msftngp13.phx.gbl:
>>
>>> 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.
>>
>>
>>
>
>
Author
22 Feb 2006 11:41 AM
Charles Law
Hi Cor

Please feel free. I'd be honoured :-)

Charles


Show quoteHide quote
"Cor Ligthert [MVP]" <notmyfirstn***@planet.nl> wrote in message
news:uiIv2k5NGHA.3732@TK2MSFTNGP10.phx.gbl...
> 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
>
> "Charles Law" <bl***@nowhere.com> schreef in bericht
> news:%23mviJK5NGHA.3196@TK2MSFTNGP09.phx.gbl...
>> 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
>>
>>
>> "Maurice" <hmoviat@nospam.nospam> wrote in message
>> news:Xns9770B2725FE78mauricemertens@194.109.133.242...
>>> "Armin Zingler" <az.nospam@freenet.de> wrote in news:OrGv#YjNGHA.428
>>> @tk2msftngp13.phx.gbl:
>>>
>>>> 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.
>>>
>>>
>>>
>>
>>
>
>
Author
22 Feb 2006 2:39 PM
Cor Ligthert [MVP]
Charles,

I made it a little bit more simple as sample. Do you agree with this?

http://www.vb-tips.com/default.aspx?ID=34241f3e-16ff-4e87-86d1-2b03e1a439ae


Cor
Author
22 Feb 2006 3:31 PM
Charles Law
Hi Cor

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

Charles


Show quoteHide quote
"Cor Ligthert [MVP]" <notmyfirstn***@planet.nl> wrote in message
news:ua$Ue27NGHA.3284@TK2MSFTNGP14.phx.gbl...
> Charles,
>
> I made it a little bit more simple as sample. Do you agree with this?
>
> http://www.vb-tips.com/default.aspx?ID=34241f3e-16ff-4e87-86d1-2b03e1a439ae
>
>
> Cor
>
Author
23 Feb 2006 3:17 PM
Maurice
Show quote Hide quote
"Cor Ligthert [MVP]" <notmyfirstn***@planet.nl> wrote in
news:ua$Ue27NGHA.3284@TK2MSFTNGP14.phx.gbl:

> Charles,
>
> I made it a little bit more simple as sample. Do you agree with this?
>
> http://www.vb-tips.com/default.aspx?ID=34241f3e-16ff-4e87-86d1-2b03e1a4
> 39ae
>
>
> Cor
>
>

Hi Charles, Cor,

thanks for the good support!

I will try this one out.


Maurice
Author
20 Feb 2006 5:18 PM
CMM
Look into Activator.CreateInstance(). This has been asked before. Do a
search for more detailed examples.


--
-C. Moya
www.cmoya.com
Show quoteHide quote
"Maurice" <hmoviat@nospam.nospam> wrote in message
news:Xns9770A5BB9E1ACmauricemertens@194.109.133.242...
> "Armin Zingler" <az.nospam@freenet.de> wrote in
> news:uDJYz8iNGHA.3856@TK2MSFTNGP12.phx.gbl:
>
>> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguid
>> e/html/cpconemittingdynamicassemblies.asp
>
> 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.
>
>
>
>
>
>
Author
20 Feb 2006 8:31 PM
Herfried K. Wagner [MVP]
"Maurice" <hmoviat@nospam.nospam> schrieb:
> 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"

Build a Custom .NET "EVAL" Provider
<URL:http://www.eggheadcafe.com/articles/20030908.asp>

Runtime Compilation (A .NET eval statement)
<URL:http://www.codeproject.com/dotnet/evaluator.asp>

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://classicvb.org/petition/>