unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, PaxCompiler;
type
TForm1 = class(TForm)
PaxCompiler1: TPaxCompiler;
PaxPascalLanguage1: TPaxPascalLanguage;
PaxProgram1: TPaxProgram;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
Y: Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// declare procedural type that conforms to a script-defined procedure
type
TProcP = procedure (X: Integer); stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
H_Y, H_P: Integer;
I: Integer;
P: Pointer;
begin
PaxCompiler1.Reset;
PaxCompiler1.RegisterLanguage(PaxPascalLanguage1);
H_Y := PaxCompiler1.RegisterVariable(0, 'Y', _typeINTEGER);
PaxCompiler1.AddModule('1', PaxPascalLanguage1.LanguageName);
PaxCompiler1.AddCode('1', 'procedure P(X: Integer);');
PaxCompiler1.AddCode('1', 'begin');
PaxCompiler1.AddCode('1', ' Y := Y + X;');
PaxCompiler1.AddCode('1', 'end;');
PaxCompiler1.AddCode('1', 'begin');
PaxCompiler1.AddCode('1', 'end.');
if PaxCompiler1.Compile(PaxProgram1) then
begin
H_P := PaxCompiler1.GetHandle(0, 'P', true);
P := PaxProgram1.GetAddress(H_P); // get address of script-defined procedure
PaxProgram1.SetAddress(H_Y, @Y);
TProcP(P)(10);
ShowMessage(IntToStr(Y));
TProcP(P)(20);
ShowMessage(IntToStr(Y));
end
else
for I:=0 to PaxCompiler1.ErrorCount do
ShowMessage(PaxCompiler1.ErrorMessage[I]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Y := 0;
end;
end.