Es gibt mal wieder ein Update
Version 0.3.5.0
Folgendes hat sich verändert:
- Bug fixes
- FindMethod hat den Rückgabetyp nicht überprüft
- Kritischer Fehler in String-Umwandlung: man konnte keine verschiedenen String-Typen benutzen
- IDE
- Konsolen-Fenster hat nicht mehr das Hauptformular als Parent (gab Probleme mit Windows 7)
- Beim "Save Project" kommt jetzt der normale Windows-Dialog
- Neues Demoprojekt: NativeCallTest
- Neue Features
- Script-Funktionen können jetzt auch zu TMethod gecastet werden (Beispiel im PDF)
- Funktions-Pointer der importierten Methoden werden jetzt nur einmal pro TSE2PE-Instanz gesetzt
SVN
Auf Drängen von
EugenB hab ich ein
SourceForge-Projekt für die ScriptEngineII erstellt
. Somit kann man sich jetzt immer den aktuellsten Quelltext per
SVN herunterladen.
Nativer Script-Methoden-Aufruf
Wie bereits gesagt kann man jetzt die Script-Methoden auch "nativ" aufrufen. Um das mal etwas zu verdeutlichen hier mal ein Beispiel:
Sagen wir mal, ich will folgende Script-Methode dem FormResize-Event zuweisen:
Delphi-Quellcode:
var
formWidth, formHeight : integer;
procedure MyFormResize(Sender: TObject);
begin
formWidth := TForm(Sender).Width;
formHeight := TForm(Sender).Height;
end;
Bisher musste man immer eine Wrapper-Funktion bauen, die folgendermaßen aussehen konnte:
Delphi-Quellcode:
// ....
Self.OnResize := MyCustomHandler;
// ...
procedure TForm1.MyCustomHandler(Sender: TObject);
var Method : Pointer;
begin
Method := Self.FRunTime.CodeAccess.FindMethod('MyFormResize', '', [pmIn], [btObject]);
if Method <> nil then
Self.FRunTime.Call(Method, [Sender]);
end;
Dann wurde bei jedem Event erst die Funktion "MyCustomHandler" ausgeführt, in der dann die Script-Funktion ausgeführt wurde.
Nun kann man wie folgt machen
Delphi-Quellcode:
// ....
Self.OnResize := MyCustomHandler;
// ...
procedure TForm1.SetEventHandler;
var Method : Pointer;
MyEvent: TNotifyEvent;
begin
Method := Self.FRunTime.CodeAccess.FindMethod('MyFormResize', '', [pmIn], [btObject]);
if Method <> nil then
begin
MyEvent := TNotifyEvent( Self.FRunTime.ScriptAsMethod(Method, nil) );
Self.OnResize := MyEvent; // <-----
end;
end;
Jetzt wird bei jedem OnResize-Event automatisch die Script-Funktion ausgeführt.
Man kann die Events zwar noch (!!!) nicht in der Script-Engine selber setzten, da man noch keine Methoden als Typ deklariert kann. Aber sobald man das machen kann, kann man die Events dann auch in der Script-Engine selber setzen.
Natürlich kann man nicht nur normale Funktionen "nativ" ausführen. Man kann auch Klassen-Methoden so aufrufen - aber ich hab das alles im PDF beschrieben.
Grüße