Die Anwendung, an der ich arbeite, ermöglicht das Einbetten von Skript sinpets in ein Dokument. Zum Beispiel:Gibt es eine Möglichkeit, variable Werte beizubehalten, wenn ein DWScript zweimal ausgeführt wird?
SomeText
<* PrintLn("This line is generated by a script"); *>
Some other text
<* PrintLn("This line is generated by a script, too"); *>
Some more lines
Ergebnisse
SomeText
This line is generated by a script
Some other text
This line is generated by a script, too
Some more lines
ich DWScript verwende. Intern wird das erste Skript-Snippet kompiliert & ausgeführt. Als nächstes ist RecompiledInContext und ausgeführt und so weiter. Eine in einem Snippet deklarierte Funktion/Variable/etc ist in allen späteren Snippets verfügbar. Die Variablenwerte gehen jedoch zwischen den Snippets verloren. Zum Beispiel:
SomeText
<* var x: Integer = 5; *>
Some other text
<* PrintLn(x); *>
Some more lines
Nach dem Erstellen des Dokuments:
SomeText
Some other text
0 <-- I would like this to be 5
Some more lines
Hier ist eine Beispielanwendung, die das Problem veranschaulicht:
program POC.Variable;
{$APPTYPE CONSOLE}
{$R *.res}
uses
dwsExprs,
dwsComp,
dwsCompiler;
var
FDelphiWebScript: TDelphiWebScript;
FProgram: IdwsProgram;
FExecutionResult: IdwsProgramExecution;
begin
FDelphiWebScript := TDelphiWebScript.Create(nil);
try
FProgram := FDelphiWebScript.Compile('var x: Integer = 2;');
FProgram.Execute;
FDelphiWebScript.RecompileInContext(FProgram, 'PrintLn(x);');
FExecutionResult := FProgram.Execute;
// The next line fails, Result[1] is '0'
Assert(FExecutionResult.Result.ToString[1] = '2');
finally
FDelphiWebScript.Free;
end
end.
Gibt es eine Möglichkeit, "Transfer" oder „halten "die variablen Werte zwischen den Ausführungen? Hier
ist eine aktualisierte Code von Andrew Antwort, die nicht funktioniert:
begin
FDelphiWebScript := TDelphiWebScript.Create(nil);
try
FProgram := FDelphiWebScript.Compile('PrintLn("Hello");');
FExecution:= FProgram.BeginNewExecution();
FDelphiWebScript.RecompileInContext(FProgram, 'var x: Integer;');
FExecution.RunProgram(0);
WriteLn('Compile Result:');
WriteLn(FExecution.Result.ToString);
FDelphiWebScript.RecompileInContext(FProgram, 'x := 2; PrintLn(x);');
FExecution.RunProgram(0); // <-- Access violation
WriteLn('Compile Result:');
WriteLn(FExecution.Result.ToString);
FExecution.EndProgram();
ReadLn;
finally
FDelphiWebScript.Free;
end
end;
Urgh ... Das Vertauschen von Skriptbefehlen unterbricht die Ausführung. Scheint die einzige Möglichkeit für Sie, diese Funktion zu arbeiten, ist tief in Bibliothek mit dem Debugger zu graben. Viel Glück für Sie mit DWSCript! :) – Andrew