Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#34

Re: ScriptEngine II (v. 0.3.5.0)

  Alt 5. Okt 2009, 21:04
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
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat