Hallo Forum,
ich möchte meine Erfahrungen mit PascalScript nochmal zusammenfassen.
So vollmundig wie RemObject die Eigenschaften von PascalScript beschreibt ist es unter Lazarus bei weitem nicht! Meiner Meinung nach sollten hier einige Komponenten aus der Palette entfernt werden, da sie falsche Hoffnung machen!
Aber jetzt zum praktischen:
Es ist mir gelungen durch erweitern des ide_editor aus PascalScript heraus ein Formular zu erzeugen und ihm einen Label und einen Button hinzuzufügen. Der OnClick des Buttons ließ sich nicht wie in den Beispielen beschrieben verwenden. Doch OnClick konnte innerhalb von ide_editor (also im Lazarus-Code) abgefangen werden und beschreibt nun die Variable ClickSender mit dem Namen der auslösenden Komponente. 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), habe ich diese Schleife genutzt um die Variable Clicksender aus dem ide_editor abzufragen. Dazu wollte ich ursprünglich wie bei RemObject in den articles beschrieben eine Klasse benutzten, aber auch das hat nicht funktioniert, da der Typ der Klasse bei der internen Typ-Prüfung von Pascalscript nicht gefunden wurde (Ich habe die Klasse wie beschrieben in OnCompile und OnExecute eingebaut; die Klasse war fast eine 1:1-Kopie von MyClass aus dem Beispiel). Also habe ich zwei weitere Prozeduren angelegt, von denen die eine ähnlich Readln den Wert von ClickSender ausliest und die andere ClickSender zurücksetzt auf einen leeren String.
Der Code sieht wie folgt aus (lassen sich hier in Forenbeiträgen eigentlich auch schön formatierte Quellcodes einfügen?):
Lazarus-Code (Erweiterung von ide_editor):
Code: Alles auswählen
function Teditor.CreateForm : TForm;
begin
result := TForm.CreateNew(self);
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);
begin
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.AddFunction(@TEditor.CreateForm, 'function CreateForm : TForm');
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;
Script-Code:
Code: Alles auswählen
Program test;
Var
F: TForm;
L: TLabel;
B: TButton;
s: string;
Vis: boolean;
procedure CloseF; // Schließt das Formular wieder.
begin
F.Close;
Vis:= False;
end;
begin
F := CreateForm; // Erzeugen des Formulars
L := TLabel.Create(TComponent(F)); // Erzeugen eines Labels
L.Parent := TWinControl(F);
L.Caption := 'Hey';
L.Left:= 10;
L.Top:= 10;
B := TButton.Create(TComponent(F)); // Erzeugen einse Buttons
B.Parent := TWinControl(F);
B.Name := 'ButMe'; // Der Name ist für das Abfangen des "Click"-Events wichtig.
B.Caption := 'Push Me';
B.Top:= 40;
B.Left := 10;
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': CloseF; // Wenn der Click-Sender "ButMe" ist Formular schließen
end;
ResetClickSender; // Zurücksetzen des ClickSenders
end;
Application.HandleMessage; // Abarbeiten anderer Events
end;
end.
@Christian
Du hast gesagt, das du PascalScript recht häufig benutzt. Hast du auch Klassen aus Lazarus-Code innerhalb von Pascal-Script freigegeben und wenn ja wie?
Noch eine Anmerkung. Ich hab mir aus lauter Verzweiflung pascalscript2 angesehen, wenn es nicht schon vier Jahre keine Neuerungen mehr gegeben hätte, scheinbar besonders für Windows gemacht wurde und noch keine Arrays kann, wäre es eine schöne Alternative gewesen und die beigefügte Doku ist allererste Sahne. Schade.