Hallo,
ich meld mich mal wieder *g*. In meinem letzten Post (der ja doch schon 2,5 Monate her ist

), hab ich ja angekündigt, dass ich versuche in 2 Monaten was auf die Beine zu stellen. Leider hab ich das Zeitlimit nicht geschafft, da ich mit diesem Post noch keine Version veröffentlichen will.
Aber ich hab mir gedacht - machste mal nen Status-Update - und diesmal ist es wirklich ein gewaltiger Schritt, den ich geschafft habe, denn
.... *trommelwirbel* ...
ich habe es endlich geschafft, dass meine Script-Sprache objekt-orientiertes Arbeiten möglich macht. Im Klartext heißt das, dass man jetzt im Script eigene Klassen erstellen kann (natürlich mit Variablen, Properties, Methoden, Constructor, Destructor, ...) und diese dann im Script verwenden. Dabei unterstützten die Klassen sogar Vererbung (also Zugriff auf Public/Protected-Properties/Methoden von Eltern-Klassen, Methoden überschreiben, usw.).
Am besten ich zeig euch mal ein kleines Script:
Delphi-Quellcode:
program Project1;
type
TTest1 =
class(TObject)
private
FABC : integer;
public
constructor Create;
override;
procedure Test1;
virtual;
property ABC : integer
read FABC;
end;
TTest2 =
class(TTest1)
public
constructor Create;
override;
procedure Test1;
override;
end;
TTest3 =
class(TTest2)
public
procedure Test1;
override;
end;
{ TTest1 }
constructor TTest1.Create;
begin
inherited;
Self.FABC := 1024;
Console.WriteLine('
TTest1.Create');
end;
procedure TTest1.Test1;
begin
Console.WriteLine('
TTest1.Test1');
end;
{ TTest2 }
constructor TTest2.Create;
begin
inherited;
Console.WriteLine('
TTest2.Create');
end;
procedure TTest2.Test1;
begin
inherited;
Console.WriteLine('
TTest2.Test1');
end;
{ TTest3 }
procedure TTest3.Test1;
begin
inherited;
Self.FABC := 512;
// nur sichtbar, da in gleicher Unit
Console.WriteLine('
TTest3.Test1');
end;
{ Main }
var p: TTest1;
// Der Basistyp
begin
p := TTest3.Create;
// eine abgeleitete Variante davon
try
Console.WriteLine(p.ABC);
p.Test1;
Console.WriteLine(p.ABC);
finally
p.Free;
end;
end.
Wenn ich dieses Script ausführe, bekomme ich folgende Ausgabe in der Konsole:
Code:
TTest1.Create
TTest2.Create
1024
TTest1.Test1
TTest2.Test1
TTest3.Test1
512
Das ist jetzt schon etwas schwerer zu lesen, aber wenn man mal mit dem Finger den Ablauf so langgeht, dann kann man das schon ganz gut nachvollziehen.
Die Script-Klassen kann ich auch aus dem Programm heraus erstellen und die Vererbung nutzen. Hier mal ein wenig Pseudo-Code (Pseudo-Code, da die einzelnen Methoden noch ein paar andere Paremter haben, die hierfür erstmal nur stören würden)
Delphi-Quellcode:
var aClass : Pointer;
aObject : Pointer;
method : Pointer;
begin
// erstmal die Klasse suchen, die erstellt werden soll
aClass := FRunTime.CodeAccess.FindClass('TTest3');
// dann eine "Instanz" der Klasse erzeugen
aObject := FRunTime.CreateClass(aClass);
// dann noch die Basis-Methode suchen
method := FRunTime.CodeAccess.FindMethod('TTest1.Test');
// und dann die Methode mit "aObject" als Self-Parameter aufrufen
FRunTime.Call(method, [aObject]);
// -> jetzt wird im Script nicht die Funktion TTest1.Test ausgeführt, sondern
// jetzt wird die Funktion "TTest3.Test" ausgeführt.
end;
Das ganze funktioniert schon sehr gut - jedoch muss ich den Compiler noch viel strenger machen. Zudem muss ich noch den Befehl "reintroduce" einbauen sowie den "inherited" - Befehl erweitern. Außerdem warten noch ein paar Bugs darauf, gelöscht zu werden.
Ich hoffe, dass ein paar Leute eine object-orientierte Script-Sprache brauchen könnten - ich brauch sie auf jeden fall
Grüße