我试图在运行时在Delphi中加载预编译的RemObjects Pascal脚本.
但是,当我尝试加载Delphi时,除了’无法导入VALUE_TEAMCODE’. Value_TeamCode是我已经在Pascal脚本中注册的Delphi应用程序中的一个函数.
但是,当我尝试加载Delphi时,除了’无法导入VALUE_TEAMCODE’. Value_TeamCode是我已经在Pascal脚本中注册的Delphi应用程序中的一个函数.
这就是我在做的事情.下面粗略的伪代码 – 实际代码分为多个文件.此外,当需要运行脚本时,下面的SetCompiled调用会在应用程序中发生.
关于代码的说明:
FPascalScript是一个TPSScriptDebugger
... //Register custom functions with Pascal Script FuncsRegister; //Load script FPascalScript.Script.AddStrings(AContent); //Compile script FPascalScript.Compile; //Get compiled script FPascalScript.GetCompiled(sCompiledScript) //Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE' FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript); ...
也许我错了.我不确定是否可以加载预编译的脚本.
我在RemObjects WebSite Wiki上搜索,但删除了Pascal脚本帮助.
我还在StackOverflow上搜索了各种主题,但似乎没有与此问题相关.
再说一遍.我已经在运行时编译和执行脚本而没有任何问题.出于性能原因,我需要预编译.
任何帮助赞赏.
更新:
目前的解决方法是在我的系统中为每个脚本配备一个脚本引擎.然后,这些引擎在预编译后保留在内存中.这将删除每个脚本编译开销30ms,否则.它也使用了更多的内存但不足以成为一个问题.
我仍然宁愿只使用一个脚本引擎.(因此需要加载预编译的脚本)
解决方法
感谢RemObject Connect beta论坛上的回复,我有一个解决方案.
(帖子见 http://connect.remobjects.com/discussion/comment/13540#Comment_13540)
(帖子见 http://connect.remobjects.com/discussion/comment/13540#Comment_13540)
谢谢你去海报vovanl.
我必须通过OnExecImport事件导入我的函数,如下所示:
... FPascalScript.OnExecImport := OnExecImport; FPascalScript.SetCompiled(sCompiledScript); ... TMyClass.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); begin se.RegisterDelphiFunction(@Value_TeamCode,'Value_TeamCode',cdRegister); end; ...
似乎SetCompiled清除所有现有注册,因此您必须挂钩OnExecImport以重新注册函数,过程,方法等.
请注意,加载预编译脚本(即将一个脚本替换为另一个脚本)似乎确实会增加一些额外的时间开销.我发现我最初的工作实际上是快6倍左右.