⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmscriptengine.pas

📁 从Delphi中调用lua
💻 PAS
字号:
unit dmScriptEngine;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Dialogs, lua, plua, LuaWrapper,
  pLuaObject, Graphics, ExtCtrls;

type

  { TScriptEngine }

  TScriptEngine = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
  private
    function GetCanvas: TCanvas;
    function GetImage: TImage;
    { private declarations }
    procedure LoadLibs(LuaWrapper : TLua);
    procedure ScriptExceptionHandler( Title: ansistring; Line: Integer; Msg: ansistring;
                                      var handled : Boolean);
  public
    { public declarations }
    Lua : TLua;
    procedure Execute(Source : AnsiString);
    property Canvas : TCanvas read GetCanvas;
    property Image  : TImage read GetImage;
  end; 

var
  ScriptEngine: TScriptEngine;

implementation

uses
  MainForm, Turtle;

function lua_Clear(L : Plua_State) : Integer; cdecl;
var
  n, c : Integer;
begin
  result := 0;
  n := lua_gettop(l);
  if (n > 0) and (lua_isnumber(l, 1)) then
    c := lua_tointeger(l, 1)
  else
    c := Integer(clWhite);
  ScriptEngine.Canvas.Brush.Color := c;
  ScriptEngine.Canvas.Pen.Color := c;
  ScriptEngine.Canvas.Rectangle(0, 0, ScriptEngine.Image.Width, ScriptEngine.Image.Height);
end;

function lua_print(L : Plua_state) : integer; cdecl;
var
  i, n : Integer;
  sl : TStringList;
  s  : AnsiString;
begin
  result := 0;
  n := lua_gettop(l);
  s := '';
  sl := TStringList.Create;
  try
    for i := 1 to n do
      s := s + lua_tostring(l, i);
    sl.Text := s;
    frmMain.memOutput.Lines.AddStrings(sl);
  finally
    sl.Free;
  end;
end;

function lua_HexToInt(L : Plua_state) : integer; cdecl;
var
  val : AnsiString;
begin
  result := 0;
  val := '$' + plua_tostring(l, 1);
  lua_pushinteger(l, StrToInt(val));
  result := 1;
end;

function lua_SetCanvasSize(L : Plua_state) : integer; cdecl;
var
  w, h : integer;
begin
  result := 0;
  w := lua_tointeger(l, 1);
  h := lua_tointeger(l, 2);
  ScriptEngine.Image.Width := w;
  ScriptEngine.Image.Height := h;
  ScriptEngine.Image.Picture.Bitmap.Width := w;
  ScriptEngine.Image.Picture.Bitmap.Height := h;
end;

{ TScriptEngine }

procedure TScriptEngine.DataModuleCreate(Sender: TObject);
begin
  Lua := TLua.Create(self);
  Lua.LibName := 'Script';
  Lua.OnLoadLibs := @LoadLibs;
  Lua.OnException := @ScriptExceptionHandler;
end;

function TScriptEngine.GetCanvas: TCanvas;
begin
  result := frmMain.imgImage.Canvas;
end;

function TScriptEngine.GetImage: TImage;
begin
  result := frmMain.imgImage;
end;

procedure TScriptEngine.LoadLibs(LuaWrapper : TLua);
begin
  LuaWrapper.RegisterLuaMethod('Clear', @lua_Clear);
  LuaWrapper.RegisterLuaMethod('print', @lua_print);
  LuaWrapper.RegisterLuaMethod('HexToInt', @lua_HexToInt);
  LuaWrapper.RegisterLuaMethod('SetCanvasSize', @lua_SetCanvasSize);
  RegisterTurtle(LuaWrapper);
end;

procedure TScriptEngine.ScriptExceptionHandler(Title: ansistring;
  Line: Integer; Msg: ansistring; var handled: Boolean);
begin
  Handled := true;
  frmMain.memOutput.Lines.Add(format('%s (%d): %s', [Title, Line, msg]));
end;

procedure TScriptEngine.Execute(Source: AnsiString);
begin
  TurtleCanvas := Canvas;
  Lua.LoadScript(Source);
  Lua.Execute;
end;

initialization
  {$I dmScriptEngine.lrs}

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -