AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal FreePascal Probleme mit PascalScript und AddMethod(Linux)
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit PascalScript und AddMethod(Linux)

Ein Thema von Cyberaxx · begonnen am 19. Mär 2015
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Probleme mit PascalScript und AddMethod(Linux)

  Alt 19. Mär 2015, 23:19
Hallo,

stehe vor dem kleinen Problem das meine Scripte unter dem RPI nicht so laufen wie unter Windows(Delphi) und hoffe das hier jemand eine Lösung kennt.
Alle Befehle laufen über AddMethod was eben unter Delphi kein Problem darstellt. Nutze ich die Unit allerdings unter Lazarus/Linux dann werden alle Befehle die über AddMethos laufen ignoriert. AddFunction läuft dagegen problemlos, zumindest die zwei Befehle die ich eben umgeschrieben habe. Neben dem Unterschied Windows/Linux ist das einzige nur noch das es unter Windows eine Fensteranwendung ist und unter Linux eine Konsolenanwendung. Beide laufen als TThread, sondern das noch wichtig ist.

Delphi-Quellcode:
  TScriptEngineThread = class(TThread)
  private
    FDevice: string;
    FModul: string;
    FParam: string;
    FData: string;
    CS: TCriticalSection;
    CA: TComAdapter;
    PS: TPSScript;
    FQry: TZQuery;
    FQueryList: TStringList;
    FWriteLn: TOnWriteLn;
    procedure PSCompile(Sender: TPSScript);
    procedure ClearQueryList;
    function AddQueryObject(Name: string): Boolean;
    function RemoveQueryObject(Name: string): Boolean;
    function GetQuery(Name: string; var Qry: TZQuery): Boolean;
    function FindQueryInList(Name: string; var Index: Integer): Boolean;
    // Script Methods
    function PS_GetDevice(): string;
    function PS_GetModul(): string;
    function PS_GetParam(): string;
    function PS_GetData(): string;
    procedure PS_WriteToModul(Device: string; Modul: string; Param: string; Data: string);
    function PS_QueryAdd(Name: string): Boolean;
    function PS_QueryRem(Name: string): Boolean;
    procedure PS_Query(Name: string; SQL: string);
    function PS_QueryRowsAffected(Name: string): Integer;
    function PS_QueryRecordCount(Name: string): Integer;
    procedure PS_QueryFirst(Name: string);
    procedure PS_QueryLast(Name: string);
    procedure PS_QueryNext(Name: string);
    procedure PS_QueryPrior(Name: string);
    function PS_QueryEof(Name: string): Boolean;
    function PS_QueryReadsInt(Name: string; Fieldname: string): Integer;
    function PS_QueryReadAsStr(Name: string; Fieldname: string): string;
    function PS_QueryReadAsFloat(Name: string; Fieldname: string): Double;
    function PS_GetDBData(Device: string; Modul: string; Param: string): string;
    procedure PS_AddWebAlert(S: string);
    procedure PS_AddWebNotification(S: string);
    procedure PS_AddWebLog(S: string);
    procedure PS_WriteLn(S: string);
    function PS_Now(): Double;
    function PS_DateTimeToStr(DateTime: Double): string;
  protected
    procedure Execute; override;
  public
    constructor Create(ComAdapter: TComAdapter);
    destructor Destroy; override;
    procedure Run(Content: string); overload;
    procedure Run(Device, Modul, Param, Data, Content: string); overload;
    property OnWriteLn: TOnWriteLn read FWriteLn write FWriteLn;
  end;

...

procedure TScriptEngineBase.PSCompile(Sender: TPSScript);
begin
  // Generic and Debug
  Sender.AddMethod(Self, @TScriptEngineBase.PS_WriteLn, 'procedure WriteLn(S: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_DateTimeToStr, 'function DateTimeToStr(const DateTime: Double): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_Now, 'function Now: Double;');
  // Get and Set Event Data
  Sender.AddMethod(Self, @TScriptEngineBase.PS_GetDevice, 'function GetDevice(): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_GetModul, 'function GetModul(): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_GetParam, 'function GetParam(): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_GetData, 'function GetData(): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_WriteToModul, 'procedure WriteToModul(Device: string; Modul: string; Param: string; Data: string);');
  // SQL Communication
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryAdd, 'function QueryAdd(Name: string): Boolean);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryRem, 'function QueryRem(Name: string): Boolean);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_Query, 'procedure Query(Name: string; SQL: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryRowsAffected, 'function QueryRowsAffected(Name: string): Integer;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryRecordCount, 'function QueryRecordCount(Name: string): Integer;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryFirst, 'procedure QueryFirst(Name: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryLast, 'procedure QueryLast(Name: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryNext, 'procedure QueryNext(Name: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryPrior, 'procedure QueryPrior(Name: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryEof, 'function QueryEof(Name: string): Boolean;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryReadsInt, 'function QueryReadsInt(Name: string; Fieldname: string): Integer;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryReadAsStr, 'function QueryReadAsStr(Name: string; Fieldname: string): string;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_QueryReadAsFloat, 'function QueryReadAsFloat(Name: string; Fieldname: string): Double;');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_GetDBData, 'function DBData(Device: string; Modul: string; Param: string; Data: string): string;');
  // Alert and Log
  Sender.AddMethod(Self, @TScriptEngineBase.PS_AddWebNotification, 'procedure AddWebNotification(S: string);');
  Sender.AddMethod(Self, @TScriptEngineBase.PS_AddWebLog, 'procedure AddWebLog(S: string);');

  Sender.AddFunction(@ShowMessage, 'procedure ShowMessage(const Msg: string)');
  Sender.AddFunction(@ExtractFileExt,'function ExtractFileExt(const FileName: string): string;');
  Sender.AddFunction(@Sleep, 'procedure Sleep(milliseconds: Cardinal);');
end;

...

procedure TScriptEngineThread.Execute;
var
  Compiled: Boolean;
  Messages: string;
  I: Integer;
begin
  Compiled := PS.Compile;

  for I := 0 to PS.CompilerMessageCount -1 do
    Messages := Messages + PS.CompilerMessages[I].MessageToString + #13#10;

  PS_WriteLn(Messages);

  if Compiled then
  begin
    try
      PS.Execute;
    except
      on E:Exception do
        PS_WriteLn(E.Message);
    end;
  end;

  PS_WriteLn('PROC::DONE');
end;

...

procedure TScriptEngineThread.PS_WriteLn(S: string);
begin
  CS.Acquire;
  try
    if Assigned(FWriteLn) then
      FWriteLn(S);
  finally
    CS.Release;
  end;
end;
Unter Lazarus und da es eine Konsolenanwendung ist wurde die PS_WriteLn durch
Delphi-Quellcode:
procedure TScriptEngineThread.PS_WriteLn(S: string);
begin
  CS.Acquire;
  try
    WriteLn(S);
  finally
    CS.Release;
  end;
end;
ersetzt. Die Konsolenausgabe funktioniert auch außerhalb des Scripts innerhalb aber nicht.

Wenn ich nun das WriteLn mittels AddFunction hinzufüge
Delphi-Quellcode:
Sender.AddFunction(@MyWriteLn, 'procedure WriteLn(S: string);');

procedure MyWriteLn(S: string);
begin
  WriteLn(S);
end;
Dann läuft auch innerhalb des Scripts die Konsolenausgabe.

Jetzt würde ich gerne wissen warum die AddMethod so nicht läuft. In den ganzen Beispielen die ich gefunden habe wird AddMethod so verwendet. In den Beispielen für Lazarus dagegen finde ich nur AddFunction.
Weiß jemand wo der Fehler liegen könnte?

Danke im vorraus.
Daniel

EDIT: Hab es unter Delphi nun auch als Konsolenanwendung laufen. Auch hier keine Probleme.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!

Geändert von Cyberaxx (20. Mär 2015 um 11:23 Uhr) Grund: Als Konsolenanwendung neu erstellt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz