Pascal Script und Interfaces

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
jan_
Beiträge: 5
Registriert: Fr 18. Mär 2022, 14:13

Pascal Script und Interfaces

Beitrag von jan_ »

Hallo,
ich habe Probleme mit PascalScript. Es wehrt sich bei den Interfaces.
mein Pascalscript ist:

Code: Alles auswählen

program classvererbungtest;
var
  mycar : Volkswagen;
  mywifescar : BMW;
  mywifessecondcar : driveable;
  
begin
  mycar := Volkswagen.create();
  mycar.drive();
  mywifescar := BMW.create();
  mywifessecondcar :=  mywifescar.drive();
  mywifessecondcar.drive();
end.
Das Programm dazu:

Code: Alles auswählen

program project1;
{$interfaces CORBA}
uses  Interfaces ,
Classes,
   uPSCompiler,
   uPSR_std,
   uPSC_std,
   uPSR_classes,
   uPSC_classes,
   uPSRuntime,
   uPSComponent,
   SysUtils,
   TypInfo,
   pascalscript;


type

  driveable = interface
    function drive( ):driveable;
  end;

  car = class Abstract (TInterfacedObject,driveable)
  public
    function drive( ):driveable;virtual;Abstract;

  end;

  Volkswagen = class(car,driveable)
  public
    function drive( ):driveable;override;
  end;

  BMW = class(car,driveable)
  public
    function drive( ):driveable;override;
  end;

  mypascalscript = class
      ps_script: TPSScript;
      procedure OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
      procedure OnCompile(Sender: TPSScript);
      constructor Create(path:string);
  end;


//mypascalscript

Constructor  mypascalscript.Create(path:string);
begin
  ps_script := TPSScript.create(nil);
  ps_script.OnCompile:= @OnCompile;
  ps_script.OnExecImport:= @OnExecImport;
  ps_script.Script.LoadFromFile(path);
  if ps_script.compile then
     ps_script.execute
  else      //show any compile errors
  begin
   writeln('Pascal Script compile Error: ');
   writeln(ps_script.CompilerErrorToStr(0));

  end;
end;

procedure mypascalscript.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
begin
  RIRegister_Std(x);
  RIRegister_Classes(x,true);

  with x.Add(car) do
  begin
    RegisterVirtualAbstractMethod(car,@car.drive, 'drive');
  end;

  with x.Add(Volkswagen) do
  begin
    RegisterMethod(@volkswagen.drive, 'drive');
  end;

  with x.Add(BMW) do
  begin
    RegisterMethod(@BMW.drive, 'drive');
  end;
end;

procedure mypascalscript.OnCompile(Sender: TPSScript);
begin

  SIRegister_Std(Sender.Comp);
  SIRegister_Classes(Sender.Comp,true);

  with (Sender.Comp.AddInterface(Sender.Comp.FindInterface('IUNKNOWN'), GetTypeData(TypeInfo(driveable))^.GUID,'driveable')) do
  begin
    RegisterMethod('Function drive( ):driveable', cdRegister);
  end;


  with Sender.Comp.AddClassN(Sender.Comp.FindClass('TOBJECT'),'car') do
  begin
//    RegisterMethod('Function drive( ):driveable'); // is abstract --> may no decleration?
  end;


  with Sender.Comp.AddClassN(Sender.Comp.FindClass('car'),'Volkswagen') do
  begin
    RegisterMethod('Function drive( ):driveable');
  end;

  with Sender.Comp.AddClassN(Sender.Comp.FindClass('car'),'BMW') do
  begin
    RegisterMethod('Function drive( ):driveable');
  end;

end;

// Volkswagen
function Volkswagen.drive( ):driveable;
begin
  writeln('Classname: '+Self.ClassName);
  writeln('Funktion: Volkswagen --> Drive');
  exit(Self);
end;

// BMW
function BMW.drive( ):driveable;
begin
  writeln('Classname: '+Self.ClassName);
  writeln('Funktion: BMW --> Drive');
  exit(Self);
end;

var
  ps_script: mypascalscript;

  mycar : Volkswagen;
  mywifescar : BMW;
  mywifessecondcar : driveable;

begin
  writeln('');
  writeln('Script:');
  writeln('');
  ps_script := mypascalscript.Create('yourscript.txt');
  writeln('');
  writeln('Compiled:');
  writeln('');
  mycar := Volkswagen.create();
  mycar.drive();
  mywifescar := BMW.create();
  mywifessecondcar :=  mywifescar.drive();
  mywifessecondcar.drive();

  readln();
end.
Nun kommt die Ausgabe:
Script:

Classname: Volkswagen
Funktion: Volkswagen --> Drive
Classname: BMW
Funktion: BMW --> Drive

Compiled:

Classname: Volkswagen
Funktion: Volkswagen --> Drive
Classname: BMW
Funktion: BMW --> Drive
Classname: BMW
Funktion: BMW --> Drive
Wie ersichtlich ist, ist im Script die Funktion BMW.drive nur einmal aufgerufen und im compilierten 2 mal.
Warum verbindet er das Interface nicht mit BMW bei der Zuweisung?
Projekt zum Download: (3Kb)
https://owncloud.yourlahr.de/index.php/ ... 1QpdWgWDLr

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Pascal Script und Interfaces

Beitrag von fliegermichl »

Ich weiss nicht, was du erreichen willst, aber das Programm macht genau das, was du befohlen hast.
1. Du erzeugst die Instanz mycar vom Typ Volkswagen und rufst mycar.drive auf.
2. Du erzeugst die Instanz mywifescar vom Typ BMW und rufst mywifescar.drive auf.
3. Du weisst mywifessecondcar := mywifescar zu und rufst erneut mywifescar.drive auf.

jan_
Beiträge: 5
Registriert: Fr 18. Mär 2022, 14:13

Re: Pascal Script und Interfaces

Beitrag von jan_ »

Hallo,
ja, aber das Script macht mywifescar.drive nicht.
das FPC Programm macht alles, die Frage ist, warum macht das RemObjects Script es nciht?

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Pascal Script und Interfaces

Beitrag von theo »

Keine Ahnung, was du erreichen willst und ich kenne auch die Grenzen von PS nicht, aber ich bekomme primär eine andere Ausgabe:
Script:

Pascal Script compile Error:
[Error] (12:19): Assignment expected
Wenn ich

Code: Alles auswählen

mywifessecondcar.drive();
auskommentiere, kompiliert es.

Lazarus 2.3.0 rmain-2_3-288-gd5fe15d448 FPC 3.2.2 x86_64-linux-gtk2

jan_
Beiträge: 5
Registriert: Fr 18. Mär 2022, 14:13

Re: Pascal Script und Interfaces

Beitrag von jan_ »

Oha, das ist ein anderes Verhalten als bei Laz. 2.2 auf Windows.
woher bekommt man Laz. 2.3 ?

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Pascal Script und Interfaces

Beitrag von theo »


Antworten