DWScript - další možnost skriptování v Delphi

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.

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".

Tagy: ,

Komponenty

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců