Jednou tu už skriptování v Delphi bylo, ale tato knihovna (DWS) se mi zdá čitelnější a podle testů autora je řádově rychlejší než dříve uvedená knihovna. Navíc se mi líbí jak se dá jednoduše integrovat a spolupracovat s kódem v Delphi.
DWS na code.google.com je primárně určeno pro Delphi 2009+ a je vylepšením (zrychlením) nyní už neudržované knihovny DelphiWebScript (pro starší Delphi).
Podporované vlastnosti:
- typy ve skriptu jsou mapovány na podobné typy (tj. string je string atd.), tj. větší rychlost než při použití Variant
- obsluha výjimek
- volání uživatelského kódu v Delphi (viz ukázka)
- varianty
- OOP včetně virtuálních metod (a operátorů IS, AS) (ukázka skriptu)
- deklarace proměnné kdekoliv
- 64bit integer
Ukážu malý program, který má dva TMemo, TDelphiWebScript a tlačítko, kde do jednoho memo se napíše program a v druhém se objeví výsledek kompilace po stisku tlačítka. Navíc zároveň předvedu volání našeho Delphi kódu ze skriptu.
unit frmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
dwsComp, StdCtrls, Dialogs, dwsExprs, dwsCompiler;
type
TMainForm = class(TForm)
DelphiWebScript: TDelphiWebScript;
memSourceCode: TMemo;
memResult: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
public
end;
var
MainForm: TMainForm;
implementation
uses
dwsFunctions, dwsSymbols;
{$R *.dfm}
// zapouzdření naší "nové" funkce
type
TOwnShowMsg = class (TInternalMagicProcedure)
procedure DoEvalProc(args : TExprBaseList); override;
end;
procedure TOwnShowMsg.DoEvalProc(args : TExprBaseList);
begin
ShowMessage('Informace: '+ args.AsString[0]);
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
prog : TdwsProgram;
begin
prog:=DelphiWebScript.Compile(memSourceCode.Lines.Text);
try
// kompilovano bez chyb?
if prog.Msgs.Count>0 then
memResult.Lines.Text:=prog.Msgs.AsInfo
else
begin
memResult.Clear;
try
prog.Execute;
memResult.Lines.Text:=(prog.Result as TdwsDefaultResult).Text;
except
on E: Exception do begin
memResult.Lines.Text:=E.ClassName+': '+E.Message;
end;
end;
end;
finally
prog.Free;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
RegisterInternalProcedure(TOwnShowMsg, 'OwnShowMsg', ['s', 'String']);
end;
end.
Ve FormCreate se registruje do skriptovacího engine naše procedure OwnShowMsg viz. třída TOwnShowMsg (mimochodem si všimněte, že jak deklarace, tak implementace jsou v části implementace), kterou budeme využívat. Naše procedura zavolá ShowMessage s informací 'Informace: '+text
Nyní ještě nějaký demo skript:
var s : String = 'Hello World!';
ShowMessage(s);
var
ss: string;
var
i: Integer;
for i := 1 to 10 do
ss := ss + IntToStr(i);
OwnShowMsg(ss);
Jak je patrné, skript je ohledně syntaxe volnější, přesto dobře detekuje chyby při "překladu".