vložil Radek Červinka
4. září 2010 01:21
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.
1unit frmMain;
2
3interface
4
5uses
6 Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
7 dwsComp, StdCtrls, Dialogs, dwsExprs, dwsCompiler;
8
9type
10 TMainForm = class(TForm)
11 DelphiWebScript: TDelphiWebScript;
12 memSourceCode: TMemo;
13 memResult: TMemo;
14 Button1: TButton;
15 procedure Button1Click(Sender: TObject);
16 procedure FormCreate(Sender: TObject);
17 public
18 end;
19
20var
21 MainForm: TMainForm;
22
23implementation
24uses
25 dwsFunctions, dwsSymbols;
26
27
28
29type
30 TOwnShowMsg = class (TInternalMagicProcedure)
31 procedure DoEvalProc(args : TExprBaseList); override;
32 end;
33
34procedure TOwnShowMsg.DoEvalProc(args : TExprBaseList);
35begin
36 ShowMessage('Informace: '+ args.AsString[0]);
37end;
38
39procedure TMainForm.Button1Click(Sender: TObject);
40var
41 prog : TdwsProgram;
42begin
43 prog:=DelphiWebScript.Compile(memSourceCode.Lines.Text);
44 try
45
46 if prog.Msgs.Count>0 then
47 memResult.Lines.Text:=prog.Msgs.AsInfo
48 else
49 begin
50 memResult.Clear;
51 try
52 prog.Execute;
53 memResult.Lines.Text:=(prog.Result as TdwsDefaultResult).Text;
54 except
55 on E: Exception do begin
56 memResult.Lines.Text:=E.ClassName+': '+E.Message;
57 end;
58 end;
59 end;
60 finally
61 prog.Free;
62 end;
63end;
64
65procedure TMainForm.FormCreate(Sender: TObject);
66begin
67 RegisterInternalProcedure(TOwnShowMsg, 'OwnShowMsg', ['s', 'String']);
68end;
69
70end.
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".