none
Code aus Textdatei verwenden RRS feed

  • Frage

  • Hi @ all,

    Ich habe mir eine Textdatei geschrieben (Code.txt). Jetzt möchte ich den Code mittels MSScriptControl aud der Datei auslesen und in meiner Form1.Textbox1 den Wert verändern, aber wie???

    Eine MsgBox aufrufen funktioniert tadellos, aber wie kann ich auf meine Textbox1 zugreifen und den Wert verändern lassen?

    Hier der Code mit dem ich meine Datei aufrufe:

    Option Explicit On
    Imports System.IO
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CodeToCompile As String
            Dim oSr As StreamReader
            Dim SC As New MSScriptControl.ScriptControl
    
            ' Gesamte Datei in einen String speichern
            oSr = New StreamReader("C:\code.txt")
            CodeToCompile = oSr.ReadToEnd
            oSr.Close()
    
    
            ' Code kompilieren
            SC.Language = "VBScript"
            SC.AllowUI = True
            SC.Reset()
            SC.AddCode(CodeToCompile)
            SC.Run("test")
        End Sub
    End Class


    und hier die Textdadei:

    Sub Test()
    MsgBox("Test")
    End Sub

    so, das funktioniert ja wunderbar, aber wenn ich die Textdatei wie folgt abändere, kommt die Fehlermeldung : Objekt erforderlich: 'Form1'

    Sub Test()
    Form1.TextBox1.Text = "Test"
    End Sub

    Was mache ich falsch, funktioniert das überhaupt????

    Vielen Dank schon mal für eure Hilfe

    Gruß

    Gab

    Sonntag, 2. September 2012 15:00

Antworten

  • Hi Stefan,

    Vielen Dank für deine Antwort.

    In der Zwischenzeit habe ich noch ein wenig herum probiert und bin auf eine Lösung gekommen.

    Ich habe lediglich vergessen, die erforderlichen Objecte mitzugeben.....

    Also hier der Inhalt meiner Code.txt

    Public Sub Test()
    atyp = textbox1.text
    avon = CByte(textbox2.text)
    abis = CByte(textbox3.text)
    astk = CByte(textbox4.text)
    
    btyp = textbox5.text
    bvon = CByte(textbox6.text)
    bbis = CByte(textbox7.text)
    bstk = CByte(textbox8.text)
    
    inita = ((avon + abis) \2) +1
    initb = ((bvon + bbis) \2) +1
    Richtextbox2.Text = ""
    Richtextbox2.Appendtext("init a = " &inita)
    Richtextbox2.Appendtext(lz)
    Richtextbox2.AppendText("init b = " &initb)
    Richtextbox2.appendtext(lz)
    
    block = textbox9.text
    platten = textbox10.text
    erg1 = block \ initb
    erg2 = erg1 * platten
    erg3 = block - (erg1 * initb)
    
    
    if erg2 <= bstk then
    Richtextbox2.AppendText(btyp & "     " & erg1 & " X " & initb & "     " & bvon & " - " & bbis)
    Richtextbox2.appendtext(lz)
    Richtextbox2.AppendText(erg3 & " Rest")
    Richtextbox2.appendtext(lz)
    exit sub
    end if
    
    
    Richtextbox2.AppendText("Wert ist zu klein")
    Richtextbox2.appendtext(lz)
    
    
    End Sub

    und jetzt hier der Codeblock der funktioniert:

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CodeToCompile As String
            Dim oSr As StreamReader
            Dim SC As New MSScriptControl.ScriptControl
    
            ' Gesamte Datei in einen String speichern
            oSr = New StreamReader("C:\code.txt")
            CodeToCompile = oSr.ReadToEnd
            oSr.Close()
    
    
            ' Code kompilieren
            SC.Language = "VBScript"
            SC.AllowUI = True
            SC.Reset()
            SC.AddCode(CodeToCompile)
            SC.AddObject("TextBox1", TextBox1, False)
            SC.AddObject("TextBox2", TextBox2, False)
            SC.AddObject("TextBox3", TextBox3, False)
            SC.AddObject("TextBox4", TextBox4, False)
            SC.AddObject("TextBox5", TextBox5, False)
            SC.AddObject("TextBox6", TextBox6, False)
            SC.AddObject("TextBox7", TextBox7, False)
            SC.AddObject("TextBox8", TextBox8, False)
            SC.AddObject("TextBox9", TextBox9, False)
            SC.AddObject("TextBox10", TextBox10, False)
            SC.AddObject("RichTextBox2", RichTextBox2, False)
            SC.AddObject("lz", Environment.NewLine, False)
            SC.Run("test")
        End Sub

    Duch das AddObject kann ich jetzt direkt auf die einzelnen Textboxen zugreifen, werte in die Rtb`s schreiben etc.....

    Wenn man darüber nachdenkt, ist es eigenltich logisch, denn wie soll soll man auf etwas zugreifen können, ohne das man es mitgibt?

    Also vielen Dank für die Bemühungen!!!!!!

    Gruß Gab

    • Als Antwort vorgeschlagen Okeanos85 Mittwoch, 12. September 2012 23:07
    • Als Antwort markiert Ionut DumaModerator Mittwoch, 10. Oktober 2012 08:55
    Samstag, 8. September 2012 11:07

Alle Antworten

  • Hallo,

    verstehe ich das richtig, das du einen Skript in deinem Programm ändern willst und diesen dann ausführen? Wenn ja, wie soll dann bitteschön

    Form1.TextBox1.Text = "Test"

    funktionieren? Da willst du in deinem Skript (welche Sprache auch immer) auf Form1 zugreifen, welche ja aber in deinem Programm liegt und dein Skript nicht kennt.

    Dim c1 As String = "Sub Test()" & vbLf & "MsgBox("""
    Dim c2 As String = """)"& vbLf & "End Sub"
    Dim result As String = c1 + textBox1.Text & c2
    Damit soltest du deinen Skriptcode erzeugen können. Es wird dann der Inahlt von textBox1 als MessageBox ausgegeben.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 2. September 2012 17:07
    Moderator
  • Hallo,

    erstmals vielen Dank für deine schnelle Antwort.

    Ich glaube ich habe mich ein wenig unklar ausgedrückt.

    Ich möchte in meinem Skript eine String - Variable deklarieren und dieser auch einen Wert zuweisen.

    Dann möchte ich gerne, den Inhalt des Strings in der form1.textbox1 stehen haben.

    z.Bsp. in die Code.txt dieser Code:

    Public Sub Test()
    var = "Test"
    End Sub

    und im Programm selber möchte ich dann auf die Variable var zugreifen können, bzw. in die Textbox schreiben lassen.

    Ist das irgendwie umsetzbar????

    Hier der Code der nicht funktioniert :-(

    Option Explicit On
    Imports System.IO
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CodeToCompile As String
            Dim oSr As StreamReader
            Dim SC As New MSScriptControl.ScriptControl
    
            ' Gesamte Datei in einen String speichern
            oSr = New StreamReader("C:\code.txt")
            CodeToCompile = oSr.ReadToEnd
            oSr.Close()
    
    
            ' Code kompilieren
            SC.Language = "VBScript"
            SC.AllowUI = True
            SC.Reset()
            Dim var As String
            SC.AddCode(CodeToCompile)
    
            SC.Run("test")
            TextBox1.Text = SC.Eval(var)
    
        End Sub
    End Class

    Sonntag, 2. September 2012 19:21
  • OK, so ist das schon verständlicher ;)

    Ich muss gestehen, das ich mich nicht sogut mit vbScript auskenne, aber hier mein bescheidener Versuch.

    Im folgenden wird eine Variable var erstellt, welche der Wert "Hallo" zugewiesen wird. Dieser wird dann in einer MessageBox angezeigt.

    Dim var
    var = "Hallo"
    MsgBox(s)

    Wenn du das nun in deinem Programm anzeigen willst, bzw. auch bearbeiten, so musst du wissen wie die Datei aufgebaut ist. Du könntest alle Zeilen einlesen und anschließend durchgehen bis var ein wert zugewiesen wird. Dann Splittest du den String am '=' auf und Zeigst die 2. Hälfte in deiner Textbox an. Wenn du nun speichern willst, so weißt du dem Element im Array den ersten teil der zuweisung var =  und dann textBox1.Text zu.

    MSDN Artikel zu:
    File.WriteAllLines()
    File.ReadAllLines()

    Ich hoffe, das dir das jetzt etwas weiter hilft. Eine andere Art den Variablenwert zu ändern, fällt mir jetzt auch nicht ein.



    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 2. September 2012 19:36
    Moderator
  • Hi,

    Nochmals vielen Dank für deine Bemühungen.

    Werde mir das mal durch den Kopf gehen lassen und ausprobieren....

    Wünsche noch einen schönen Abend!!!

    Sonntag, 2. September 2012 20:10
  • Werde mir das mal durch den Kopf gehen lassen und ausprobieren....

    VBScript hat mit VB.NET aber rein gar nichts zu tun. Daher frage ich mich, warum Du das eigentlich machen willst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 3. September 2012 08:52
    Moderator
  • Hallo Stefen, ich habe ein ziemlich komplexes Rechenprogramm geschrieben... Jetzt kommt es natürlich vor, das einige Rechenwege von Zeit zu Zeit abgeändert werden müssen. Ist ja eigentlich kein Problem, ich setz mich zu hause hin und ändere den code, erstelle das project neu und tausche dann an Ort und Stelle die erforderlichen Dateien aus..... Die Idee die ich hatte war also folgende, Ich schreibe meinen Quallcode in eine Textdatei, rufe diesen dann in meinem Program ab und wenn es wieder zu einer Änderung kommt, schicke ich die geänderte Textdatei per email mit einer batch datei, die dann einfach die alte codedatei löscht und die neue Code.txt in den gewünschten Ordner schiebt. Habe jetzt viel herumprobiert, die einzigste Möglichkeit die ich sehe ist folgende: ich lasse einen Temp. - Ordner erstellen, speichere in diesen Ordner die Variablen ab und rufe sie dann in meinem Programm wieder ab, ist zwar etwas umständlich aber eine bessere Idee habe ich noch nicht.
    Samstag, 8. September 2012 08:19
  • Hallo,

    dazu fällt mir noch etwas ein. Du könntest ja mittels vbc.exe eine DLL erstellen, die eine Funktion enthält, die aus deiner EXE abgerfuen wird. Diese müsstest du aus deiner neuen Code-Datei von deiner EXE aus erzeugen. Dann tauschst du die alte gegen die neue DLL  aus, löschst die Textdatei und startest dein Programm neu. Solange keine neue Textdatei exististiert, verwendest du die neue.

    In der Theorie funktioniert das, ob es in der Praxis aber Praktikabel wäre und funktioniert, kann ich dir nich sagen.


    Was ist denn das für ein Rechenprogramm? Wenn es so etwas ist wie der Windowstaschenrechner, so wäre es doch garnicht nötig, den Code zu ändern, es würde ja auch die Rechnung reichen, welche du als string einlesen könntest.


    Ich hoffe, das dir das jetzt etwas weiter hilft. :)

    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 8. September 2012 09:06
    Moderator
  • Hi,

    wenn ich das richtig verstanden habe, suchst Du sowas wie:

      paxScript.NET

    Aber Du solltest dich davon verabschieden, direkt auf Resourcen innerhalb deiner Anwendung (bspw. deine Formulare) zugreifen zu können. Das wird sehr wahrscheinlich nicht funktionieren. Hier solltest Du eher dazu übergehen, die Rückgabewerte der Aufrufe des dynamischen Codes auszuwerten und dann in deiner eigenen Anwendung die GUI Elemente zu aktualisieren.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 8. September 2012 09:22
    Moderator
  • Hi Stefan,

    Vielen Dank für deine Antwort.

    In der Zwischenzeit habe ich noch ein wenig herum probiert und bin auf eine Lösung gekommen.

    Ich habe lediglich vergessen, die erforderlichen Objecte mitzugeben.....

    Also hier der Inhalt meiner Code.txt

    Public Sub Test()
    atyp = textbox1.text
    avon = CByte(textbox2.text)
    abis = CByte(textbox3.text)
    astk = CByte(textbox4.text)
    
    btyp = textbox5.text
    bvon = CByte(textbox6.text)
    bbis = CByte(textbox7.text)
    bstk = CByte(textbox8.text)
    
    inita = ((avon + abis) \2) +1
    initb = ((bvon + bbis) \2) +1
    Richtextbox2.Text = ""
    Richtextbox2.Appendtext("init a = " &inita)
    Richtextbox2.Appendtext(lz)
    Richtextbox2.AppendText("init b = " &initb)
    Richtextbox2.appendtext(lz)
    
    block = textbox9.text
    platten = textbox10.text
    erg1 = block \ initb
    erg2 = erg1 * platten
    erg3 = block - (erg1 * initb)
    
    
    if erg2 <= bstk then
    Richtextbox2.AppendText(btyp & "     " & erg1 & " X " & initb & "     " & bvon & " - " & bbis)
    Richtextbox2.appendtext(lz)
    Richtextbox2.AppendText(erg3 & " Rest")
    Richtextbox2.appendtext(lz)
    exit sub
    end if
    
    
    Richtextbox2.AppendText("Wert ist zu klein")
    Richtextbox2.appendtext(lz)
    
    
    End Sub

    und jetzt hier der Codeblock der funktioniert:

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CodeToCompile As String
            Dim oSr As StreamReader
            Dim SC As New MSScriptControl.ScriptControl
    
            ' Gesamte Datei in einen String speichern
            oSr = New StreamReader("C:\code.txt")
            CodeToCompile = oSr.ReadToEnd
            oSr.Close()
    
    
            ' Code kompilieren
            SC.Language = "VBScript"
            SC.AllowUI = True
            SC.Reset()
            SC.AddCode(CodeToCompile)
            SC.AddObject("TextBox1", TextBox1, False)
            SC.AddObject("TextBox2", TextBox2, False)
            SC.AddObject("TextBox3", TextBox3, False)
            SC.AddObject("TextBox4", TextBox4, False)
            SC.AddObject("TextBox5", TextBox5, False)
            SC.AddObject("TextBox6", TextBox6, False)
            SC.AddObject("TextBox7", TextBox7, False)
            SC.AddObject("TextBox8", TextBox8, False)
            SC.AddObject("TextBox9", TextBox9, False)
            SC.AddObject("TextBox10", TextBox10, False)
            SC.AddObject("RichTextBox2", RichTextBox2, False)
            SC.AddObject("lz", Environment.NewLine, False)
            SC.Run("test")
        End Sub

    Duch das AddObject kann ich jetzt direkt auf die einzelnen Textboxen zugreifen, werte in die Rtb`s schreiben etc.....

    Wenn man darüber nachdenkt, ist es eigenltich logisch, denn wie soll soll man auf etwas zugreifen können, ohne das man es mitgibt?

    Also vielen Dank für die Bemühungen!!!!!!

    Gruß Gab

    • Als Antwort vorgeschlagen Okeanos85 Mittwoch, 12. September 2012 23:07
    • Als Antwort markiert Ionut DumaModerator Mittwoch, 10. Oktober 2012 08:55
    Samstag, 8. September 2012 11:07
  • Hi Koopakiller,

    Dieses Rechenprogramm genauer zu erklären, ist etwas kompliziert, hat aber nichts mit einem Windowstaschenrechner zu tun...

    Es geht darum, den vorhanden "Platz" am besten auszunutzen....

    Wir bearbeiten Aufträge von kunden und dann werden die Sachen je nach Kundenwunsch individuell zusammengestellt. Sowas mit Zettel und Taschenrechner zu machen, dauert zwischen 30 und 60 Minuten pro Auftrag, deshalb auch mein Programm, damit dauert es nicht mal 5 Minuten, bis alles eingegeben und berechnet ist.

    Jetzt kommt es natürlich auch vor, das sich die Rechenwege von Zeit zu Zeit ändern können und das ich nicht jedesmal ins visual Studio gehen möchte, den Quallcode ändern, dannach wieder die Dateien austauschen etc.... möchte ich den Codeblock in einer Textdatei haben. diese Rufe ich dann im Programm auf, ändere den Rechenweg, speichere diesen ab und fertig. Also lediglich eine Arbeitserleichterung für mich.

    Bin jetzt auf eine Lösung gekommen und werde probieren, mein Vorhaben umzusetzen.

    Aber trotzdem vielen Dank für deine Bemühungen!!!!!!

    SG Gab 

    Samstag, 8. September 2012 11:32
  • Hallo Bluefantasy,

    Es freut uns dass Du Dein Problem lösen könntest und
    danke dass Du Deine Lösung hier im Forum gepostet hast. Jetzt können auch
    andere unter Umständen profitieren die das gleiche Problem haben. 

    Gruß,

    Ionut


    Mittwoch, 10. Oktober 2012 08:54
    Moderator