• 使用innerfuse脚本


    使用innerfuse脚本语言
    innerfuse脚本语言(或交互式财务计划系统)是建立从不同的2个部分:
    –编译器
    –运行
    编译器,可以发现在ifpscomp.pas单元,运行时在ifps3.pas单位,不依赖于对方。可以使用编译器和运行时直接使用组件,或它的包装,该tifps3compexec组件可以在ifps3compexec单位和包装的编译器和执行在一个易于使用的类。使用组件的版本ifps3必须把它放在窗体或数据模块。设置或指定脚本属性,调用编译方法和执行方法。任何错误警告或提示发生在编译可以发现在该compilermessages数组属性和运行时错误可以通过阅读execerrortostring属性。
    以下示例将编译和执行空脚本(开始的):
    var
       Messages: string;
       compiled: boolean;
     begin
       ce.Script.Text := 'begin end.';
       Compiled := Ce.Compile;
       for i := 0 to ce.CompilerMessageCount -  do
         Messages := Messages + ce.CompilerMessages[i].MessageToString + # 3# 0;
       if Compiled then
         Messages := Messages + 'Succesfully compiled'# 3# 0;
       ShowMessage('Compiled Script: '# 3# 0+Messages);
       if Compiled then
       begin
         if Ce.Execute then
              ShowMessage('Succesfully Executed')
            else
              ShowMessage('Error while executing script: '+Ce.ExecErrorToString);
       end;
     end;
    默认组件不仅增加了一些标准功能的脚本引擎(确切的名单在ifpscomp.pas顶部)。除了标准功能有一些库文件包含在ifps3:
    tifps3dllplugin:  允许脚本使用动态链接库函数的语法是:function FindWindo (C1, C2: PChar): Longint;external 'FindWindo  A@user32.dll stdcall';
    TIFPS3CE_ Controls: 进出库controls.pas和graphics.pas。
    TIFPS3CE_DB:   进出库db.pas。
    TIFPS3CE_DateUtils: 进出库的日期/时间相关函数。
    TIFPS3CE_Std:   进出库tobject和类单位。
    TIFPS3CE_StdCtrls:  进出库extctrls和按钮。
    TIFPS3CE_Forms:  导入库的形式和菜单单元。
    使用这些库,将它们添加到您的窗体或数据模块,选择TIFPS3CompExec组件的插件属性旁的[……],设置插件组件的插件属性。除了标准的库文件,可以方便地添加新的功能的脚本引擎。例如,创建一个新的方法来揭露脚本引擎:
    procedure TForm .ShowNewMessage(const Message: string);
     begin
       ShowMessage('ShowNewMessage invoked:'# 13#10+Message);
     end;
    接下来你须要分配一个事件处理器(event handler)给OnCompile事件,并使用TIFPS3CompExec的AddMethod 方法去添加的实际方法:
    procedure TForm .CECompile(Sender: TIFPS3CompExec);
     begin
       Sender.AddMethod(Self, @TForm .ShowNewMessage, 'procedure ShowNewMessage
     (const Message: string);');
     end;
    一个使用这个函数的简单样本,可以看起来像这样:
    begin
       ShowNewMessage('Show This !');
     end.
    高级功能:
    IFPS3包括预处理,允许你使用定义({$IFDEF}, {$ELSE}, {$ENDIF}),并且包含其他文件在你的脚本。({$I filename.inc}),要使用这些功能,得把UsePreprocessor属性设置为true,还必须得设置MainFileName为脚本的名字放在你的脚本属性里。这些定义属性指定默认的设置,当需要一个包含文件时要调用OnNeedFile事件。
    function TForm .ceNeedFile(Sender: TObject; const OrginFileName: String;
       var FileName, Output: String): Boolean;
     var
       path: string;
       f: TFileStream;
     begin
       Path := ExtractFilePath(ParamStr(0))  + FileName;
       try
         F := TFileStream.Create(Path, fmOpenRead or fmShareDenyWrite);
       except
         Result := false;
         exit;
       end;
       try
         SetLength(Output, f.Size);
         f.Read(Output[ ], Length(Output));
       finally
         f.Free;
       end;
       Result := True;
     end;
    当这些属性设置好后,CompilerMessages数组属性将包含出现在这些讯息的文件名字。
    IFPS3的另一特色是可能从Delphi调用方法脚本。下面的示例将作为一个脚本:

    function TestFunction(Param : Double; Data: String): Longint;
     begin
       ShowNewMessage('Param : '+FloatToString(param )+# 13# 10+'Data: '+Data);
       Result :=  1234567;
     end;
     begin
     end.
    在使用这些脚本函数之前,必须检查匹配的参数和结果类型,这些可以在OnVerifyProc事件中完成。
    procedure TForm .CEVerifyProc(Sender: TIFPS3CompExec;
       Proc: TIFPSInternalProcedure; const Decl: String; var Error: Boolean);
     begin
       if Proc.Name = 'TESTFUNCTION' then
       begin
         if not ExportCheck(Sender.Comp, Proc, [btU8, btDouble, btString], [pmIn,
     pmIn]) then
         begin
           Sender.Comp.MakeError('', ecCustomError, 'Function header for
     TestFunction does not match.');
           Error := True;
         end else
         begin
           Proc.aExport := etExportDecl;
           Error := False;
         end;
       end else
         Error := False;
     end;
    ExportCheck测试参数匹配,在这种情况下btu8是一个布尔值(结果型),btdouble是第一个参数和btString第二个参数。[pmIn pmIn]说明这两个参数都是in参数。可以使用这个脚本函数,必须为这个函数创建一个事件声明并调用。
    type
       TTestFunction = function (Param : Double; Data: String): Longint of object;
     ...
     var
       Meth: TTestFunction;
       Meth := TTestFunction(ce.GetProcMethod('TESTFUNCTION'));
       if @Meth = nil then
         raise Exception.Create('Unable to call TestFunction');
       ShowMessage('Result: '+IntToStr(Meth(pi, DateTimeToStr(Now))));
    这也可以在脚本引擎中添加在脚本内使用的变量。要做到这一点,必须使用AddRegisteredVariable函数。在OnExecute事件可以这样设置:
    procedure TForm .ceExecute(Sender: TIFPS3CompExec);
     begin
       CE.SetVarToInstance('SELF', Self); // For class variables
       VSetInt(CE.GetVariable('MYVAR'),  1234567);
     end;
    读完这个变量,脚本执行完成后,你可以使用
    OnAfterExecute事件,并用VGetInt(CE.GetVariable(“MYVAR”)。


    注:
    一些函数和常数,可能需要补充:ifpscomp,ifps3和ifps3utl到uses中。
    ——脚本引擎应用本身从来不调用Application.ProcessMessages,可能将会申请挂起,当脚本在运行时,为了避免如此,可以添加Application.ProcessMessages到TIFPS3CompExec.OnLine event。
    ——可能会在脚本引擎肿引用你自己的类。IFPS3 includes一个工具,在/ Unit-Importing /directory下创建导入库。
    ——源码部分为界面每一个method/function包含一个小的描述。这些说明,也可以/Help/Units 目录.
    ——一些小例子都能在/Help/下找到
    —— / DUnit /目录,包含一个DUnit test application for IFPS3。你需要http://dunit.sourceforge.net/去运行这个。
    ——例如:如何分别使用编译器和运行时,看Demo_Import /和Demo_Kylix。
    ——Ide-demo和unit-import SynEdit需要http://synedit.sourceforge.net/

    (以上为本人拙略翻译过来的文档,借鉴时应该谨慎)

  • 相关阅读:
    UEditor百度编辑器
    form提交
    EL表达式
    spring mvc <mvc;resources>
    filter 拦截ajax请求
    ORACLE 数据库的级联查询 一句sql搞定(部门多级)
    快速排序算法
    实时监听输入框值变化
    javaScript cookie 操作
    webUtil
  • 原文地址:https://www.cnblogs.com/IceKernel/p/2269426.html
Copyright © 2020-2023  润新知