понедельник, 27 мая 2013 г.

Pascal Script - компоненты для выполнения сценариев в Lazarus.

Давно знаком с этими компонентами. И вот снова судьба свела с ними. Это компоненты для выполнения сценариев на языке Pascal.
Здесь их скачать можно: https://github.com/remobjects/pascalscript

Несколько описаний и примеров работы.
http://wiki.freepascal.org/Pascal_Script
http://www.foxbase.ru/Delphi-components/remobjects-pascalscript.htm
http://goodbyamerica.sourceforge.net/PS01_rus.html

Установились на Lazarus без проблем (1.0.8).

Вкрадце как использовать.

В Uses добавить uPSComponent, uPSRuntime.

var
  Script: TPSScript;
begin
  Script := TPSScript.Create(nil);
  Script.OnCompile := OnCompileScript;


  Script.OnExecute := OnExecuteScript;


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

  if not Script.Compile then
  begin // не скомпилировалось
    if Script.CompilerMessageCount > 0 then
      for i := 0 to Script.CompilerMessageCount - 1 do
      ShowMessage(Script.CompilerErrorToStr(i));
    end
    else begin
      Script.Execute;
    end;
end;



procedure TForm1.OnCompileScript(Sender: TPSScript);
begin

  Sender.AddFunction(@SendLog, 'procedure SendLog(s:string)');

  Sender.AddRegisteredVariable('id', 'integer');

  Sender.AddMethod(Self, @TMOO.GetDevPropInt,
    'function GetDevPropInt(id:integer;key:string;def:integer):integer;');

end;

procedure TForm1.OnExecuteScript(Sender: TPSScript);
begin
  VSetInt(Sender.GetVariable('id'), 234);
end;


Немного поясню. Создаем класс. Определяем два события, они нужны для регистрации функций и переменных (OnCompile) и для передачи значений в скрипт (OnExecute).
В свойство Script передаем текст скрипта.
Метод Compile компилирует скрипт, Execute выполняет то что получилось.
В скрипте можно выполнять методы класса (AddMethod). Можно также выполнять статические функции (AddFunction). Для передачи в скрипт значений нужно выполнить два шага: зарегистрировать сначала переменную и тип (AddRegisteredVariable) а уже в событии OnExecute выполнить присваивание этой переменной значения VSetInt(Sender.GetVariable('id'), 234);.

Скрипт по умолчанию поддерживает следующие типы:
Byte, Shortint, Word, Smallint, Longword, Longint, Int64, Single, Double, Extended, Variant, String, WideString, Char, WideChar.
В скрипте доступны практически всё что и в Lazarus.
Документации не много - пробуйте.

Можно добавлять классы и формы и еще много чего, но это уже отдельная тема.

Комментариев нет:

Отправить комментарий