使用RemObjects Pascal Script

article/2025/11/8 1:46:56

摘自RemObjects Wiki

本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本.

Pascal Script包括两个不同部分:

  • 编译器 (uPSCompiler.pas)
  • 运行时 (uPSRuntime.pas)

两部分彼此独立.可以分开使用,或通过TPSScript 控件使用他们,这个控件定义在uPSComponent.pas单元,对这两个部分进行简易封装.

要使用控件版本的Pascal Script,首先要将控件放在窗体或data module上,并设置script属性,调用Compile和Execute方法.编译的错误,警告,提示可在CompilerMessages数组属性中获取,同样运行时错误存储在ExecErrorToString属性中.

下面的范例将编译并执行一个空脚本("begin end."):

var

  Messages: string;

  compiled: boolean;

begin

  ce.Script.Text := 'begin end.';

  Compiled := Ce.Compile;

  for i := 0 to ce.CompilerMessageCount -1 do

    Messages := Messages +

                ce.CompilerMessages[i].MessageToString +

                #13#10;

  if Compiled then

    Messages := Messages + 'Succesfully compiled'#13#10;

  ShowMessage('Compiled Script: '#13#10+Messages);

  if Compiled then begin

    if Ce.Execute then

      ShowMessage('Succesfully Executed')

    else

      ShowMessage('Error while executing script: '+

                  Ce.ExecErrorToString);

  end;

end;

默认情况下,控件只向脚本引擎添加少数几个标准函数(具体函数可从uPSComponents.pas单元顶部获取).

除了标准函数,Pascal Script还包含几个函数库:

 

TPSDllPlugin

允许脚本使用DLL中的导出函数,语法:
function FindWindow(C1, C2: PChar): Longint; external'FindWindowA@user32.dll stdcall';

TPSImport_Classes

导入Tobject和Classes单元.

TPSImport_DateUtils

导入date/time相关函数.

TPSImport_ComObj

在脚本中可使用COM对象.

TPSImport_DB

导入db.pas.

TPSImport_Forms

导入Forms及Menus单元.

TPSImport_Controls

导入Controls.pas和Graphics.pas单元.

TPSImport_StdCtrls

导入ExtCtrls和Buttons.

 

要使用这些库,将相应控件添加到窗体或Data Module中,选择TPSCompiler控件点击plugins属性后的[...]按钮,增加一个新项并设置其Plugin属性为特定的插件控件.除了这些标准库函数,还可以轻松的向脚本引擎添加新函数.为了实现这个目的,首先创建要导出给脚本引擎的函数,例如:

procedure TForm1.ShowNewMessage(const Message: string);

begin

  ShowMessage('ShowNewMessage invoked:'#13#10+Message);

end;

然后,实现TPSCompile控件的OnCompile事件,使用AddMethod方法注册实际方法:

procedure TForm1.CECompile(Sender: TPSScript);

begin

  Sender.AddMethod(Self, @TForm1.ShowNewMessage,

                   'procedure ShowNewMessage

                   (const Message: string);');

end;

在脚本中调用方式:

begin

  ShowNewMessage('Show This !');

end.

高级特性

Pascal脚本支持预编译,可以使用{$IFDEF}, {$ELSE}, {$ENDIF}指令,而且可以使用{$I filename.inc}指令将其他文件内容引入脚本中.为了使用这个特性,必须设置UsePreprocessor属性为True,而且MainFileName属性必须与Script属性中的脚本名称相匹配.Defines属性指定预定义指令,在OnNeedFile事件中处理引入其他文件.

function TForm1.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[1], Length(Output));

  finally

  f.Free;

  end;

  Result := True;

end;

当设置了这些属性,CompilerMessages数组属性将输出包含文件的名称.

另外,你可以在Delphi中调用脚本中的函数.下面的代码定义在脚本中:

function TestFunction(Param1: Double; Data: String): Longint;

begin

  ShowNewMessage('Param1: '+FloatToString(param1)

                 +#13#10+'Data: '+Data);

  Result := 1234567;

end;

 

begin

end.

在使用脚本中的函数之前,必须检查函数参数与返回值类型,可在OnVerifyProc事件中进行.

procedure TForm1.CEVerifyProc(Sender: TPSScript;

                              Proc: TPSInternalProcedure;

                              const Decl: String;

                              var Error: Boolean);

begin

  if Proc.Name = 'TESTFUNCTION' then begin

    if not ExportCheck(Sender.Comp, Proc,

               [btS32, btDouble, btString], [pmIn, pmIn]) then begin

      Sender.Comp.MakeError('', ecCustomError, 'Function header for

      TestFunction does not match.');

      Error := True;

    end

    else begin

      Error := False;

    end;

  end

  else

    Error := False;

end;

ExportCheck函数检查参数是否匹配.本例中,btu8是boolean (返回值类型), btdouble是第一个参数, btString是第二个参数.[pmIn, pmIn]指示两个参数都是IN参数.要调用这个脚本函数还需要为这个函数创建一个事件声明.

type

  TTestFunction = function (Param1: 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))));

也可以向脚本引擎中添加变量,使之可在脚本中使用.可在OnExecute事件中调用AddRegisteredVariable函数实现:

procedure TForm1.ceExecute(Sender: TPSScript);

begin

  CE.SetVarToInstance('SELF', Self);

  // ^^^ For class variables

  VSetInt(CE.GetVariable('MYVAR'), 1234567);

end;

在脚本执行完毕后,读取变量的新值,可在OnAfterExecute事件中调用: VGetInt(CE.GetVariable('MYVAR')).

向脚本引擎注册外部变量,有两个步骤,首先在OnCompile事件中,使用AddRegisteredPTRVariable函数向脚本中添加变量声明.

procedure TMyForm.PSScriptCompile(Sender: TPSScript);

begin

  Sender.AddRegisteredPTRVariable('MyClass', 'TButton');

  Sender.AddRegisteredPTRVariable('MyVar', 'Longint');

end;

这就将外部变量MyClass和MyVar导入了.其次,在OnExecute事件中将变量与具体指针关联:

procedure TMyForm.PSScriptExecute(Sender: TPSScript);

begin

  PSScript.SetPointerToData('MyVar', @MyVar, PSScript.FindBaseType(bts32));

  PSScript.SetPointerToData('Memo1', @Memo1, PSScript.FindNamedType('TMemo'));

end;

这里在脚本中有两种类型变量,基础类型(如下表的简单类型),及类类型.基础类型定义在uPSUtils.pas单元,可使用FindBaseType函数获取.类类型使用FindNamedType按名称获取.在脚本中修改变量将直接影响关联的变量.

基础类型:

btU8

Byte

btS8

Shortint

btU16

Word

btS16

Smallint

btU32

Longword

btS32

Longint

btS64

Int64

btSingle

Single

btDouble

Double

btExtended

Extended

btVariant

Variant

btString

String

btWideString

WideString

btChar

Char

btWideChar

WideChar

基于控件的Pascal脚本也可执行脚本函数.需要使用ExecuteFunction方法.

ShowMessage(CompExec.ExecuteFunction([1234.5678, 4321,

                                      'test'],

                                     'TestFunction'));

这将执行叫做'TestFunction'的函数,有三个参数,一个float类型,一个integer类型和一个string类型.返回值直接传给ShowMessage.

注意:

  • 为使用一些函数和常量,有必要将uPSCompiler.pas, uPSRuntime.pas和uPSUtils.pas引入到uses中.
  • 脚本引擎不会主动调用Application.ProcessMessages,导致脚本运行时应用程序挂起.为了避免这个问题,可在TPSScript.OnLine事件中调用Application.ProcessMessages.
  • 如果要向脚本引擎导入自定义的类,可以使用/Unit-Importing/目录下的工具生成导入类库.
  • 如果要向脚本脚本引擎导入自定义类,可使用Bin目录下的工具生成导入类库.
  • 如果分开使用compiler和runtime,请见Import和Kylix范例.
  • Debug范例需要控件SynEdit http://synedit.sourceforge.net.

Retrieved from "http://wiki.remobjects.com/wiki/Using_RemObjects_Pascal_Script"

转载于:https://www.cnblogs.com/MaxWoods/p/3304954.html


http://chatgpt.dhexx.cn/article/GvRXevOS.shtml

相关文章

搭建一个简单的Pascal脚本开发环境

使用innosetup进行打包,涉及到需要编写一些Pascal脚本,所以了解了下Pascal的相关语法。 这里主要介绍如何搭建一个简单的Pascal开发环境。 一、Free Pascal Free Pascal(全称 FPK Pascal)是一个32位和64位专业Pascal编译器。它…

pascal编程语言介绍

Pascal是一种过程式编程语言,由Niklaus Wirth于1968年设计并于1970年发布,并以法国数学家和哲学家Blaise Pascal的名字命名。Pascal可以运行在多种平台上,例如Windows、Mac OS和各种版本的UNIX/Linux。[3] 软件名称 Pascal 软件平台 Windows、…

Free Pascal IDE安装

1. Free Pascal IDE 安装 首先,去 https://www.freepascal.org/download.var 下载Free Pascal IDE。我选择的sourceforge镜像 fpc-3.0.2.i386-win32.exe,下载比较慢,请耐心等待。下载完成后,双击exe文件进行安装&#xf…

[pascal入门]数组

一、本节目标 本节我们将要讲述数组。本节目标: 一维数组二维数组字符数组 二、一维数组 我们通过一个案例来简单的理解数组。班主任要计算班级里面50个同学数学成绩的平均成绩,道理上讲这是一个比较简单的问题,只需要把每个人的成绩加起来除…

linux的pascal语言,pascal语言视频教程 Linux GCC常用命令详解

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言&#xff0…

vscode 配置 pascal环境

vscode 配置 pascal环境 网上关于配置pascal的教程不太多,我试验了好几个,都没搞对,其中有很多原因吧,最后从较多、较熟悉的c环境开始配置理解,才算是慢慢懂得了这个配置过程,前前后后大概花一个星期&…

信息学竞赛 c语言 pascal,pascal信息学竞赛教程

第一讲: 信息学竞赛讲座:预备知识 计算机语言是计算机软件中非常独特的一部份,它属于系统软件,但又和应用软件息息相关。它的作用是:使人类能够用某些命令、指令去让计算机为人类进行数值、逻辑运算。计算机语言中,只有一种语言是…

Pascal基础教程

第一课 初识Pascal语言 信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力。选手首先应针对竞赛中题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后要写出高级语言程序,上机调试…

【通用学术英语视听说答案】

通用学术英语视听说答案–主编郎曼、侯霞

英语视听说第六版答案

Unit 1 Unit 2 Unit 3 Unit 4 Unit 5 Unit 6 Unit 7 Unit 8

welearn平台答案 大学英语 视听说 综合教程

打开页面 f12 ctrlshiftc 鼠标移动到选项位置 带data-solution的就是答案

u校园新视野英语 视听说 读写

一、软件介绍 主要由浏览器插件的形式实现辅助看课 完全模拟人工操作,自动答题,刷时长 二、软件下载 https://www.lanzous.com/b01hihtxg 打包好的脚本浏览器,打开即用,无需配置 三、主要功能 进入课程后自动寻找未完成的任…

视听说教程(第三版)4 quiz 2

视听说教程(第三版)4 quiz 2 //中文注解都是亲自查阅并打上去的,既是为了完善自己的词库,同时也有助于小伙伴们的阅读与理解 //您的支持是我更新的不竭动力! //希望点个赞或者投个币,支持一下吧&#xff0…

U校园视听说读写答题时长分享教程

脚本介绍: U校园题库,U校园题答案,U校园新视野答案,U校园刷时长 一、主要功能: 自动填入答案、支持作业与测试、支持视听说单元测试、支持期末考试。已测试可用,有需要的可下载好自行测试。 二、实现原…

新概念外语视听说检测离开破解

作为苦逼的大学生,一般都有视听说要做(其实就是挂时长,每单元45分钟),但视听说网页会检测你是不是离开了,也就是挂机,如果5分钟你不对页面进行操作,页面就会自动弹出一个提醒窗口&am…

视听说加速器_腾讯加速器台服专享加速线路已开通,多款手游一键即可免费加速!...

哈喽哈喽,腾妹来啦~周五快乐撒~ 号外!号外!腾妹今天带来一个重大消息,腾讯网游加速器外服通用加速可支持台服线路了哦,满足了大家想玩台服游戏的需求~而且台服最大优点就是中文版,不用担心看不懂&#xff0…

视听说教程(第三版)4 quiz 5

视听说教程(第三版)4 quiz 5 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. The Oxford Dictionary offers many definitions of independent, including “not depending on the authority of…

中国海洋大学跨文化交际视听说复习

[跨文化](intercultural communication)中国海洋大学跨文化交际视听说复习 中国海洋大学跨文化交际视听说复习 你好! 这是我第一次使用CSDN发文,不知道发些什么;最近复习跨文化交际,整理了一下老师划的重点,做了一些…

视听说教程(第三版)4 quiz 3

视听说教程(第三版)4 quiz 3 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. The destruction of our natural resources and contamination of our food supply continue to occur, largely be…

视听说教程(第三版)4 quiz 4

视听说教程(第三版)4 quiz 4 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. As all forms of electricity generation involve some harmful environmental effects, the conservation of energ…