|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Eval function vb.netHi,
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 "Maurice" <hmoviat@nospam.nospam> schrieb This line is to be part of which method, class, namespace, assembly?> 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" 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 "Armin Zingler" <az.nospam@freenet.de> wrote in Hi Armin,news:uDJYz8iNGHA.3856@TK2MSFTNGP12.phx.gbl: > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguid > e/html/cpconemittingdynamicassemblies.asp 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.
Show quote
Hide quote
"Maurice" <hmoviat@nospam.nospam> schrieb Creating an object by class name has been asked three times in a row, that's> 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. 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 "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. "Maurice" <hmoviat@nospam.nospam> schrieb A class name usually doesn't change, and if it changes we have to change the> "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. 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 No.> you can use? 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 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. > > > 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. >> >> >> > > 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. >>> >>> >>> >> >> > > 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 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 >
Show quote
Hide quote
"Cor Ligthert [MVP]" <notmyfirstn***@planet.nl> wrote in Hi Charles, Cor,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 > > thanks for the good support! I will try this one out. Maurice Look into Activator.CreateInstance(). This has been asked before. Do a
search for more detailed examples. 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. > > > > > > "Maurice" <hmoviat@nospam.nospam> schrieb: Build a Custom .NET "EVAL" Provider> 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" <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/>
Best data structure?
empty GUID from string in VB2005 Changing CheckedState or Checked-value without raising ItemChecked-event Opacity Unable to open file Installing published application fails Create object through classname How to change "database and User" into CR9 Webservice MyApplication has encountered a problem... when not Administrator! What is the difference between VB.NET and ASP.NET?? |
|||||||||||||||||||||||