unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, PaxProgram, PaxCompiler, PaxRegister, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    PaxCompiler1: TPaxCompiler;
    PaxPascalLanguage1: TPaxPascalLanguage;
    PaxProgram1: TPaxProgram;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure PaxProgram1UnhandledException(Sender: TPaxProgram;
      E: Exception; const ModuleName: String; SourceLineNumber: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  IMPORT_Classes;

var
  H_TForm: Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  PaxCompiler1.Reset;
  PaxCompiler1.RegisterLanguage(PaxPascalLanguage1);
  PaxCompiler1.AddModule('1', 'Pascal');
  PaxCompiler1.AddCode('1', Memo1.Lines.Text);
  PaxCompiler1.RegisterVariable(0, 'Self', H_TForm, @Form1);

  PaxPascalLanguage1.SetCallConv(_ccREGISTER);

  if PaxCompiler1.Compile(PaxProgram1) then
  begin
    PaxProgram1.Run;
  end
  else
    for I:=0 to PaxCompiler1.ErrorCount - 1 do
      ShowMessage(PaxCompiler1.ErrorMessage[I]);
end;

procedure TForm1.PaxProgram1UnhandledException(Sender: TPaxProgram;
  E: Exception; const ModuleName: String; SourceLineNumber: Integer);
begin
  ShowMessage(
      'Exception (' + E.Message +
      ') raised at line ' + IntToStr(SourceLineNumber) + ':' +
      PaxCompiler1.Modules[ModuleName][SourceLineNumber]
  );
end;

function TControl_GetParent(Self: TControl): TWinControl;
begin
  result := Self.Parent;
end;

procedure TControl_SetParent(Self: TControl; Value: TWinControl);
begin
  Self.Parent := Value;
end;

var
  H: Integer;

initialization

  H := RegisterClassType(0, TControl);
  RegisterClassType(0, TWinControl);
  RegisterHeader(H, 'function _GetParent: TWinControl;', @TControl_GetParent);
  RegisterHeader(H, 'procedure _SetParent(Value: TWinControl);', @TControl_SetParent);
  RegisterProperty(H, 'property Parent: TWinControl read _GetParent write _SetParent;');

  H_TForm := RegisterClassType(0, TForm);
  RegisterHeader(H_TForm, 'constructor Create(AOwner: TComponent); override;',
    @TForm.Create);
  RegisterHeader(H_TForm, 'function ShowModal: Integer;', @TForm.ShowModal);
  RegisterHeader(H_TForm, 'destructor Destroy; override;',
    @TForm.Destroy);

  H := RegisterClassType(0, TButton);
  RegisterHeader(H, 'constructor Create(AOwner: TComponent); override;',
    @TButton.Create);

  RegisterHeader(0, 'procedure ShowMessage(const Msg: string);', @ShowMessage);


end.
