Verwendung von PascalScript

Rund um die LCL und andere Komponenten
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von PascalScript

Beitrag von mschnell »

petwey hat geschrieben:Da sich der Script ohnehin in einer Warteschleife befinden muss (sonst könnte man das Formular ja nicht verwenden und dort generierte Daten ans Script zurückgeben),


Hört sich schrecklich an. Was genau meinst Du mit "Warteschleife". (Auf die reagiere ich immer allergisch :D )

Lazarus ist in Event-getriebenes System und das sollte sich bei Pascal-Script entsprechen fortsetzen. Da sind "busy loop" Wartescheifen im User-Code verboten.

Richtiger Weise müsste der Script-Code also nach der Initialisierung (u.a Erzeugen der Forms, wenn du das tatsächlich im Script machen willst) einfach verlassen werden (Return in den Iniitialisierungs-Code - z.B. im "OnCreate Event - des native Pascal Codes).

Wenn dann später ein ein entsprechendes Ereignis auftritt (egal ob durch den native Pascal Code Deines Programms oder mehr oder weniger direkt durch die GUI ausgelöst), sollte der zugehörige Event-Handler (callback) im Script aufgerufen werden.

-Michael
Zuletzt geändert von mschnell am Mo 4. Apr 2016, 11:06, insgesamt 1-mal geändert.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von PascalScript

Beitrag von mschnell »

petwey hat geschrieben: aber meines Wissens sind Instanzen von Klassen doch auch Zeiger....

In normalem übersetzten Pascal Code sind Instanzen von Klassen natürlich Zeiger auf den Instanz-"Record" vom Typ der Klasse, der bei Create auf dem Heap angelegt wird.

Im Script kann ich mir nicht vorstellen, dass da die Instanz-Variable einfach ein Pointer ist, der auf die gleichen Klassen-Instanz im native-Code zeigt. Das Script braucht z.B. eine Beschreibung der Typen der einzelnen Werte im Klassen-"Record" etc, weil es sich ja erst zur Laufzeit damit beschäftigen kann.

Es gibt doch irgendeinen Übergabe-Mechanismus, wenn man Klassen-Instanzen sowohl im Native Pascal Code als auch im Script verwenden will ?!?!? (wie gesagt: keine persönlichen Erfahrungen). Da sollte (für den User transparent) eine entsprechende Konvertierung stattfinden .

-Michael
Zuletzt geändert von mschnell am Di 5. Apr 2016, 12:22, insgesamt 1-mal geändert.

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo mschnell,

auch Dir Danke für deine Antwort. Vielleicht ist der Begriff Warteschleife schlecht gewählt und es sollte besser Idle-Schleife heißen, aber ein entsprechender Mechanismus wird selbst in den Beispielen verwendet und was soll man machen wenn keine Events zwischen Lazarus- und Script-Code ausgetauscht werden können.
Der Code-Schnipsel (Script) zeigt das die Anwendung durchaus noch auf Events reagieren kann (ProcessMessages)

Code: Alles auswählen

  while Vis do // Programm-Schleife solange Vis gesetzt ist.
    begin
      GetClickSender(s)// Namen eines möglichen Click-Senders ermitteln.
      if s <> '' then
      begin
        case s of
        'ButMe': CloseF;  // Wenn der Click-Sender "ButMe" ist Formular schließen
        end;
        ResetClickSender; // Zurücksetzen des ClickSenders
      end;
      Application.HandleMessage// Abarbeiten anderer Events
    end;
 

Für den Script an sich langt für mich durchaus ein Schritt für Schritt abgearbeiteter Code, der ist an dieser Stelle sogar übersichtlicher.
Wenn Du allerdings herausfinden solltest wie sich Events (Callbacks) zwischen Lazarus und Script austauschen lassen, dann wäre ich für ein Code-Beispiel dankbar. Ich habs auf viele Weisen probiert (auch nach den beispielen) und bin gescheitert.

Zu dem Übergabe-Mechanismus kann ich nur sagen, dass ich auch hier die Beschreibung und die Beispiele durchgearbeitet habe und wie schon in meinen vorangegangenen Beiträgen erwähnt, ist es mir nicht gelungen weiter zu kommen, deshalb bin ja etwas sauer auf die Komponenten und die Beschreibungen. Wenn du ein lauffähiges Beispiel hast, wäre ich auch hier sehr dankbar und interessiert.

Aber nochmals: Was ich mit der Script-Engine umsetzen möchte kann ich (auch grafische Oberflächen können erzeugt werden und über Umwege auf die Events zugegriffen werden) und ihre Grenzen sind mir nun auch bekannt.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von PascalScript

Beitrag von mschnell »

Wenn "Application.HandleMessage()" erst zurück kommt, wenn eine Event für die Script-Engine ausgelöst wurde und während dessen das Native-Code Programm permanent laufen gelassen wird, ist das OK (wenn es auch sehr unschön ist, das im User-Code machen zu müssen. Eigentlich müsste (wie bei Lazarus in der LCL ) die Infra-Struktur-Library die "Idle-Loop" enkapsulieren. ) Schau doch nochmal in die Doku von Pascal-Script ob sich das nicht besser machen lässt...

Trotzdem finde ich dieses Vorgehen nicht gut. Es sollte doch eigentlich reichen, vom Native-Pascal-Code Aufrufe (Funktionen und Callbacks) in das Script zu machen: z.B. In Form1.OnCreate o.ä zur Initialisierung des Scripts und bei jedem auftretenden Event (sei es nun ziemlich direkt als Folge einer GIU-Aktion oder weil das Native-Code Programm dem Script etwas mitteilen will).


>> Wenn Du allerdings herausfinden solltest wie sich Events (Callbacks) zwischen Lazarus und Script austauschen lassen...

Da Events ja nichts anders sind als Klassen-Variablen eines Prozeduralen Type, die vom Code, der die Klasse instanziiert mit der Adresse eine (Klassen) - Funktion belegt werden, muss das in der besprochenen Klassen-Übergabe Funktionalität vom Script zum Native-Code und umgekehrt geregelt sein .

-Michael

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo mschnell,
danke für die Hinweise.
mschnell hat geschrieben:Schau doch nochmal in die Doku

Die Doku besteht aus Beispielen und ist an sonsten dürftig bis nicht existent, deshalb meine Frage zu Anfang des Themas nach brauchbarer Doku.
mschnell hat geschrieben:Es sollte doch eigentlich reichen, vom Native-Pascal-Code Aufrufe (Funktionen und Callbacks) in das Script zu machen:

Genau das ist das Problem, wie schon Christian erwähnt hat, scheint es hier ein Problem mit Zeigern zu geben.
An sonsten wäre es hilfreich mal die Beispiel-IDE von PascalScript auszuprobieren, damit wir hier vom gleichen reden. :wink:
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Verwendung von PascalScript

Beitrag von Christian »

Hier
https://github.com/remobjects/pascalscript/issues/78
Ist die Issue zu der Pointer Geschichte.
Du kannst ja auch noch was zu schreiben vllt lässt sich der Carlo irgendwann bekehren da 1-2 Tage drauf zu verwenden.
Alternativ kannst du dich natürlich auch damit beschäftigen. Dazu muss man aber recht tief im Plattform Assembler stecken.

Vllt findet sich auch ein Fpc developer der sich tief mit den Systemen auskennt und da helfen würde (Hust Marco ?) :)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von PascalScript

Beitrag von mschnell »

Die sagen " And don't work event on button click."

Das ist ein GUI Event und kommt also mehr oder weniger von extern (aus der Infra-Struktur).

Geht in einem 64 Bit System denn ein "normales" Event ?

- ein im native-Code Pascal und im Script gemeinsam verwendeten Objekt (kreiert vom Native Code und übergebe an das Script oder umgekehrt) gibt es eine prozdurale variable ("of object").
- diese wird vom Script mit (der Adresse) einer Prozedur beschrieben und der native-Pascal Code ruft sie auf
oder
- diese wird vom native Pascal Code mit (der Adresse) einer Prozedur beschrieben und das Script ruft sie auf

Die sagen am Ende auch "This issue is also the cause for callbacks not working on 64bit right?"

Heißt das, dass solche normalen Events tatsächlich auch nicht funktionieren ? Dann ist das ding ja mehr oder weniger unbrauchbar :(

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Verwendung von PascalScript

Beitrag von Christian »

Gilt nur für 64bit, da man auf Windows im Normalfall 32bit verwendet ist es in 95% der Fälle eben nicht nutzlos.
Bisher ist es kaum jemandem aufgefallen...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von PascalScript

Beitrag von mschnell »

Ich interpretiere Deine Message so, dass tatsählich in 64 Bit Systemen gar keine Event/Callbacks gehen, nicht nur welche, die direkt aus der GIU-Infrastruktur kommen.

Mit "unbrauchbar" meinte ich natürlich "unbrauchbar auf 64 Bit Systemen".

-Michael

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo Forum,

sorry das ich so lange nichts von mir hören habe lassen, aber ich war arbeitsbedingt unabkömmlich.

Die Pause war aber auch zu etwas gut, denn vielleicht liegt die Lösung all meiner Probleme darin den Code als 32-Bit-Version zu kompilieren. Was liegt hier näher als die cross-compilierung anzuwenden. Und zwar von linux-x64 zu linux-i386. Ich hab mich an die Anweisungen in http://wiki.lazarus.freepascal.org/Cross_compiling/de gehalten. Hat alles geklappt (make und make install als root ausgeführt).

Danach hab ich Lazarus geöffnet, das ide-editor Projekt geöffnet und bei den Projekteinstellungen/Compilereinstellungen/Konfiguration und Pfade als Ziel-CPU-Familie i386 eingestellt und mit OK bestätigt. Und da kommt mein Problem: Fehler: Compiler "/usr/bin/fpc" unterstützt nicht das Ziel i386-linux.

Meine Vermutung: Das frisch compilierte Zeugs wird nicht gefunden. Aber da steht in der Beschreibung nur
Das ist alles. Bearbeiten sie ihre /etc/fpc.cfg Datei falls erforderlich.


Nach einem Blick in die fpc.cfg sehe ich da viele Pfad-Angaben die auf /usr/lib64/fpc/$fpcversion/units/$fpctarget verweisen. Als Target finde ich hier nur x86_64-linux aber nicht das erhoffte i386-linux.

Was hab ich da falsch gemacht? Wie komm ich da weiter? Ich weiss nicht wirklich was ich das anpassen kann / sollte.

Ich weiss das hat jetzt nicht direkt was mit Komponenten zu tun, ich will ja auch so schnell wie möglich wieder zum Kernproblem zurück.

Danke für Eure Hilfe.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo Forum,

nach meinem Unvermögen unter Linux Cross-Compiling hinzukriegen bin ich auf:
WinXP 32Bit, Lazarus 1.6.0 und FPC3.0.0 in einer VirtualBox umgestiegen, da ich nicht auf die Lösung des Cross-Compilens warten wollte.
Nach allem was ich hier gelesen habe sollten also unter Win32 die Beispiele die mit Pascalscript kommen auch funktionieren -> tun sie aber wieder nicht (betrifft die vissuellen Komponenten).
Also gut ich besinne mich auf meine Ausarbeitung (siehe mein Beitrag vom 29.März hier). Aber auch diese, unter Linux 64Bit lauffähige, Lösung funktioniert nicht. Das Formular lässt sich noch erzeugen und darstellen, aber das Erzeugen von visuellen Komponenten scheitert beim create.

Ich habe jetzt begonnen das Problem zu umgehen, so dass Formulare als Objekt in einer Stringlist im Lazarus-Code erzeugt und abgelegt werden, das scheint zu funktionieren. Der nächste Schritt wird sein einen Button auf dem Formular zu erzeugen und die Events abzufangen. Bin gespannt ob das klappt! Ob pointer und selbst definerte Klassen funktionieren weiss ich noch nicht.

Ich muss wieder betonen, das die Pascalscript-Komponenten und ihre Fähigkeiten (scheinbar ist hier Lazarus der gemeinsame Nenner, denn ursprünglich scheint Pascalscript für Delphi programmiert worden zu sein) nicht halten was sie versprechen. Ich brauche eine Lösung, die mit gleichem Script-Code unter Linux, Windows, 32 und 64-Bit lauffähig ist. Eventuell kann ich auf 64-Bit verzichten, dann muss allerdings das Cross-Compilieren klappen.

Ich lass wieder von mir hören, wenn ich mehr weiss.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Verwendung von PascalScript

Beitrag von marcov »

petwey hat geschrieben:
Danach hab ich Lazarus geöffnet, das ide-editor Projekt geöffnet und bei den Projekteinstellungen/Compilereinstellungen/Konfiguration und Pfade als Ziel-CPU-Familie i386 eingestellt und mit OK bestätigt. Und da kommt mein Problem: Fehler: Compiler "/usr/bin/fpc" unterstützt nicht das Ziel i386-linux.

Meine Vermutung: Das frisch compilierte Zeugs wird nicht gefunden. Aber da steht in der Beschreibung nur
Das ist alles. Bearbeiten sie ihre /etc/fpc.cfg Datei falls erforderlich.



Das ist nicht an fpc.cfg relatiert, fpc.cfg kommt später.

Der Kompiler hat zwei Teilen: der "Treiber" Binary "fpc(.exe)" und der tatsächliche Kompiler "ppc<etwas>(.exe)". mit etwas 386 (für 32-bit x86) und ppcx64 fuer 64-bit x86.

"fpc" ist selber zb 64-bit. Dann sucht fpc zuerst nach ppcx64. Man kann fragen was fpc versucht zu ausführen mit "fpc -PP" (default Procezzzor) oder fpc -PB (was es versucht aus zu führen)


Code: Alles auswählen

marcov@zeus:~$ fpc -PB
/home/marcov/bin/ppc386
marcov@zeus:~$ fpc -PP
i386
marcov@zeus:~$
 


Aber wen man ein nicht standard ppc* ausführen will, wird "cross" eingeblendet, zb wenn ich mit mein 32-bit fpc den x86_64 Kompiler ausführen will:

Code: Alles auswählen

 
marcov@zeus:~$ fpc -Px86_64 -PB
ppcrossx64
 


Vielleicht ist eine normale i386 und ein normaler x86_64 Kompiler installiert und ist der "fpc" von der 64-bit Installation.

versuch mal ein Symlink von ppcross386 zu ppc386 zu legen.

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo markov,

Danke für deine Antwort. Die Sache mit dem Symlink hab ich nicht ganz verstanden. Vielleicht kannst du da ein Beispiel geben, das wäre sehr nett.
Aber ich hab die anderen Befehle ausgeführt und wenn ich Dich richtig verstanden habe, dann geben mir die Befehle an wie fpc konfiguriert ist - will sagen ob es eine 32- oder 64-Bit EXE erzeugt. Ich hab auch mal die Betriebssystemversion herausgeschnüffelt (64 oder 32 Bit). Hier meine Eingaben:

Code: Alles auswählen

peter@linux-cbda:~> fpc -PB
ppc386
peter@linux-cbda:~> fpc -PP
i386
peter@linux-cbda:~> uname -m
x86_64 

Ich kann mich jetzt täuschen aber der letzte Befehl sagt mir, dass ich ein 64-Bit Betriebssystem habe und die Befehle davor, dass ich 32-Bit Programme erzeuge oder liege ich jetzt schief. Es wäre echt peinlich, denn ich erzähle die ganze Zeit dass ich mit 64-Bit arbeite :oops: !
In diesem Zusammenhang hab ich bei Google nach einem Befehl für linux gesucht, der mir sagt ob ein Programm 32 oder 64 Bit ist, hab aber nichts gefunden. Kann mir da jemand auf die Sprünge helfen? In der Art: ~> Programmversion "MeinProgramm" --> i386. Das gibts bestimmt.

Hab grad noch unter Lazarus Hilfe/Über Lazarus geöffnet und folgende VersionsInfo erhalten: Lazarus 1.6 r51634 FPC 3.0.0 x86_64-linux-gtk 2. Hilft das?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Verwendung von PascalScript

Beitrag von petwey »

Hallo Forum,

ich wollte Euch auf dem laufenden halten. Die ganze Diskussion Zeiger, 32-Bit und 64-Bit scheint mir recht müßig zu sein. Punkt ist auf einem System gehen Teile von Pascalscript die auf anderen nicht funktionieren. Wer eine Anwendung mit Pascalscript ausstattet und auf unterschiedlichen Plattformen arbeiten will muss hier sehr aufpassen. Meine Vorgehensweise war jetzt die Schnittmenge von mir verfügbaren Systemen zu bilden, d.h. das System mit dem geringeren Befehlsumfang so zu erweitern, dass es überall läuft. Die beiden Plattformen, die ich dabei ausprobiert habe sind WinXP 32-Bit und linux 64-Bit, dabei ist linux das Host-System mit einem WinXP in der VirtualBox. WinXP hat sich als das System mit dem geringeren Befehlsumfang (in Bezug auf Pascalscript) erwiesen. Also fehlende Befehle in WinXP einbauen und danach unter Linux testen ob der Code kompatibel ist. Folgende Punkte habe ich bisher herausgefunden:
    1. Funktionen (in Lazarus implementiert und in PascalScript freigegeben) sind mit Vorsicht zu genießen. Es empfiehlt sich statt dessen Prozeduren mit var-Parametern zu verwenden wenn man Rückgabewerte im Script braucht.
    2. TForm ist dem Script zwar bekannt, aber nicht alles funktioniert (bisher weiß ich das Width, Height, Parent, BringToFront, Free, Font, Create und CreateNew nicht funktionieren)
    3. Der Konstructor der Komponenten scheint nicht zu funktionieren (bisher gefunden bei TLabel, TEdit, TButton und TGroupBox)
    4. Events von visuellen Komponenten können nur über Umwege abgefangen werden (siehe vorherige Beiträge).
Aber nochmals ich finde PascalScript nicht schlecht(Schleifen, Bedingungen, Variablen, Unterprogramme wollte ich nicht neu erfinden), aber es fehlt eine gescheite Doku, mit Hinweisen zu den Stolpersteinen.
Ich poste hier die Erweiterungen im Quell-Code der unter den beiden Plattformen (WinXP 32-Bit und linux 64-Bit) getestet ist.
Lazarus-Code:

Code: Alles auswählen

procedure Teditor.CreateForm(var AName: string; var AForm: TForm);
begin
  while (slNamedForms.IndexOf(AName)<>-1) do
    AName := AName +'1';
  AForm := TForm.Create(self);
  AForm.Name := AName;
  slNamedForms.AddObject(AName,AForm);
end;
 
procedure Teditor.SetFormSize(AForm: TForm; AWidth, AHeight: integer);
begin
  if AWidth <> -1 then
    AForm.Width := AWidth;
  if AHeight <> -1 then
    AForm.Height := AHeight;
end;
 
procedure Teditor.FreeForm(AForm: TForm);
Var
  i : integer;
begin
  if slNamedForms.IndexOfObject(AForm) <> -1 then
  begin
    for i := 0 to AForm.ComponentCount - 1 do
      AForm.Components[i].Free;
    slNamedForms.Delete(slNamedForms.IndexOfObject(AForm));
    AForm.Free;
  end;
end;
 
procedure Teditor.GetFormFont(AForm: TForm; var FFont: TFont);
begin
  FFont := AForm.Font;
end;
 
procedure Teditor.MakeFrontMost(AForm: TForm);
begin
//  AForm.BringToFront;
 
  SetForegroundWindow(AForm.Handle);
end;
 
procedure Teditor.CreateGroupBox(AOwner: TWinControl; var AGroupBox: TGroupBox);
begin
  AGroupBox := TGroupBox.Create(AOwner);
  AGroupBox.Parent := AOwner;
end;
 
procedure Teditor.CreateLabel(AOwner: TWinControl; var ALabel: TLabel);
begin
  ALabel := TLabel.Create(AOwner);
  ALabel.Parent := AOwner;
end;
 
procedure Teditor.CreateButton(AOwner: TWinControl; var AButton: TButton);
begin
  AButton := TButton.Create(AOwner);
  AButton.Parent := AOwner;
end;
 
procedure Teditor.CreateEdit(AOwner: TWinControl; var AEdit: TEdit);
begin
  AEdit := TEdit.Create(AOwner);
  AEdit.Parent := AOwner;
end;
 
procedure TEditor.SetOnClick(ACtrl : TControl);
begin
  ACtrl.OnClick:=@ClickEvent;
end;
 
procedure Teditor.ClickEvent(Sender: TObject);
begin
//  ShowMessage('Gedrückt: '+TComponent(Sender).Name);
  ClickSender:=TComponent(Sender).Name;
end;
 
procedure Teditor.GetClickSender(var s : string);
begin
  s := ClickSender;
end;
 
procedure Teditor.ResetClickSender;
begin
  ClickSender := '';
end;
 
procedure Teditor.ceCompile(Sender: TPSScript);
Var
  i : integer;
begin
  for i := 0 to slNamedForms.Count - 1 do
  begin
    TForm(slNamedForms.Objects[i]).Free;
  end;
  slNamedForms.Clear;
  Sender.AddMethod(Self, @TEditor.Writeln, 'procedure writeln(s: string)');
  Sender.AddMethod(Self, @TEditor.Readln, 'procedure readln(var s: string)');
  Sender.AddRegisteredVariable('Self', 'TForm');
  Sender.AddRegisteredVariable('Application', 'TApplication');
  Sender.AddMethod(Self, @TEditor.CreateForm, 'procedure CreateForm(var AName: string; var AForm: TForm)');
  Sender.AddMethod(Self, @TEditor.SetFormSize, 'procedure SetFormSize(AForm: TForm; AWidth, AHeight: integer)');
  Sender.AddMethod(Self, @TEditor.FreeForm, 'procedure FreeForm(AForm: TForm)');
  Sender.AddMethod(Self, @TEditor.GetFormFont, 'procedure GetFormFont(AForm: TForm; var FFont: TFont)');
  Sender.AddMethod(Self, @TEditor.MakeFrontMost, 'procedure MakeFrontMost(AForm: TForm)');
  Sender.AddMethod(Self, @TEditor.CreateGroupBox, 'procedure CreateGroupBox(AOwner: TWinControl; var AGroupBox: TGroupBox)');
  Sender.AddMethod(Self, @TEditor.CreateLabel, 'procedure CreateLabel(AOwner: TWinControl; var ALabel: TLabel)');
  Sender.AddMethod(Self, @TEditor.CreateButton, 'procedure CreateButton(AOwner: TWinControl; var AButton: TButton)');
  Sender.AddMethod(Self, @TEditor.CreateEdit, 'procedure CreateEdit(AOwner: TWinControl; var AEdit: TEdit)');
  Sender.AddMethod(Self, @TEditor.SetOnClick, 'procedure SetOnClick(ACtrl : TControl)');
  Sender.AddMethod(Self, @TEditor.GetClickSender, 'procedure GetClickSender(var s: string)');
  Sender.AddMethod(Self, @TEditor.ResetClickSender, 'procedure ResetClickSender');
end

Pascal-Script-Code:

Code: Alles auswählen

Program test;
Var
  s : string;
  F : TForm;
  L : TLabel;
  B : TButton;
  E : TEdit;
  Vis : Boolean;
  dwawF : TForm;
  dwawB : TButton;
  GB: TGroupBox;
  FF : TFont;
 
procedure dwawShow(AFCap, ABCap, ABName: string);
var
  dwawS : string;
begin
  dwawS := 'dwawForm';
  CreateForm(dwawS,dwawF);   // Erzeugen des Formulars
  dwawF.Caption := AFCap;
  SetFormSize(dwawF,170,40);
  dwawF.Position := poMainFormCenter;
  CreateButton(TWinControl(dwawF),dwawB);
  dwawB.Name := ABName;
  dwawB.Caption := ABCap;
  dwawB.Top:= 10;
  dwawB.Left := 10;
  dwawB.Width := 150;
  SetOnClick(TControl(dwawB))// Einrichten des "Click"-Events für den Button
  dwawF.Show;
  MakeFrontMost(dwawF);
end;
 
procedure dwawRemove;
begin
  dwawF.Hide;
  dwawB.Free;
  FreeForm(dwawF);
end;
 
procedure CloseF;   // Schließt das Formular wieder
begin
  s := E.Text;
  F.Close;
end;
 
begin
  s:= 'MyForm';
  CreateForm(s,F)// Erzeugen des Formulars
  GetFormFont(F,FF)// Formular-Font ermitteln
  FF.Size := 13// Globale Änderung der Font.Size
  F.Caption := s;
  CreateGroupBox(TWinControl(F),GB); // Erzeugen einer GroupBox im Formular
  GB.Caption := 'Alles meins';
  GB.Height := 200;
  CreateLabel(TWinControl(GB),L); // Erzeugen eines Labels in der Groupbox
  L.Caption := 'Hallo';
  L.Left := 10;
  L.Top := 10;
  CreateButton(TWinControl(GB),B)// Erzeugen eines Buttons in der GroupBox
  B.Name := 'ButMe'// Der Name ist für das Abfangen des "Click"-Events wichtig.
  B.Caption := 'Push Me';
  B.Top := 40;
  B.Left := 10;
  CreateEdit(TWinControl(GB),E)// Erzeugen eines Editier-Feldes in der GroupBox
  E.Top := 70;
  E.Left := 10;
  E.Text := 'empty';
  SetOnClick(TControl(B));    // Einrichten des "Click"-Events für den Button
  Vis := True// Flag für die Sichtbarkeit des Formulars
  F.Show;
  while Vis do   // Programm-Schleife solange Vis gesetzt ist.
  begin
    GetClickSender(s);    // Namen eines möglichen Click-Senders ermitteln.
    if s <> '' then
    begin
      case s of
      'ButMe': begin
          CloseF;    // Wenn der Click-Sender "ButMe" ist Formular schließen
          dwawShow('Hallo', 'BumbMe', 'Bumper');
        end;
      'Bumper': begin
          Vis := False;
          dwawRemove;
        end;
      end;
      ResetClickSender;   // Zurücksetzen des ClickSenders
    end;
    Application.HandleMessage;    // Abarbeiten anderer Events
  end;
end.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Verwendung von PascalScript

Beitrag von Christian »

Ach noch eine ergänzung.
Methoden müssen als virtual deklariert sein.
Einige der Fehler könnten auch daher kommen.
Und fpc 3.0.0 construktoren funktionieren derzeit nicht (Bugreport hab ich erstellt)

Marco, hat dich die calling Convention für Konstruktoren geändert ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten