2012-09-23 9 views
5

Ich frage mich, ob DWScript unterstützt, eine Skriptmethode als Ereignishandler für ein Steuerelement in einem Delphi-Formular zu verwenden. Zum Beispiel möchte ich ein TButton OnClick-Ereignis mit einer Methode verknüpfen, die im Skript existiert.Delphi-Webskript (DWScript) verknüpfen eine Skriptmethode mit einem externen Steuerelementereignis

Ich bin in der Lage, dies mit der RemObjects Delphi-Skript-Engine durch Aufruf von GetProcMethod, die ein TMethod-Objekt zurückgibt. Ich verwende dann SetMethodProp, um die Skriptmethode dem OnClick-Ereignis einer Schaltfläche zuzuweisen.

procedure LinkMethod(SourceMethodName: String; Instance: TObject; ScriptMethodName: String); 
var 
    ScriptMethod: TMethod; 
begin 
    ScriptMethod := ScriptEngine.GetProcMethod(ScripMethodName); 

    SetMethodProp(Instance, SourceMethodName, ScriptMethod); 
end; 

Ich mag würde dies anstelle des Rem in DWScript tun Objekte Skript-Engine, wie es einige andere Sachen tut, die ich brauche.

Antwort

2

Ich entschied mich stattdessen mit RemObjects zu gehen. Es war am einfachsten zu benutzen und tut was ich brauche.

1

AFAIK DWScript unterstützt nicht direkt, was Sie erreichen möchten, aber es könnte auf andere Weise implementiert werden. Ich werde versuchen, einige Quellcode zu veröffentlichen, wie es implementiert werden könnte, aber Sie müssen es wahrscheinlich an Ihre Bedürfnisse anpassen.

Zuerst eine wenig Wrapper-Klasse angeben, die für jedes Skript Verfahren getrennt sein sollten:

type 
    TDwsMethod = class 
    private 
    FDoExecute: TNotifyEvent; 
    FScriptText: string; 
    FDws: TDelphiWebScript; 
    FLastResult: string; 
    FMethod: TMethod; 
    protected 
    procedure Execute(Sender: TObject); 
    public 
    constructor Create(const AScriptText: string); virtual; 
    destructor Destroy; override; 

    property Method: TMethod read FMethod; 
    property LastResult: string read FLastResult; 
    published 
    property DoExecute: TNotifyEvent read FDoExecute write FDoExecute; 
    end; 

constructor TDwsMethod.Create(const AScriptText: string); 
begin 
    inherited Create(); 
    FDoExecute := Execute; 
    FScriptText := AScriptText; 
    FDws := TDelphiWebScript.Create(nil); 
    FMethod := GetMethodProp(Self, 'DoExecute'); 
end; 

destructor TDwsMethod.Destroy; 
begin 
    FDws.Free; 
    inherited Destroy; 
end; 

procedure TDwsMethod.Execute(Sender: TObject); 
begin 
    ShowMessage('My Method executed. Value: ' + FDws.Compile(FScriptText).Execute().Result.ToString); 
end; 

Nun müssen wir eine Instanz dieser Klasse irgendwo in unserem Code erstellen (zB in der Form Ereignis erstellen):

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    FDWSMethod := TDwsMethod.Create('PrintLn(100);'); //in constructor we pass script text which needs to be executed 
    //now we can set form's mainclick event to our DWS method 
    SetMethodProp(Self, 'MainClick', FDWSMethod.Method); 
end; 

procedure TMainForm.FormDestroy(Sender: TObject); 
begin 
    FDWSMethod.Free; 
end; 

wenn wir jetzt MainClick unser Skript aufrufen kompiliert und ausgeführt wird:

Script method executed from form's event

+1

Danke dafür. Leider werde ich den Namen des Ereignisses der benötigten Parameter bis zur Laufzeit nicht kennen. RemObjects behandelt das Abfangen des Ereignisaufrufs und das Weiterleiten der Parameter an den Skript-Ereignishandler. Auf diese Weise müssen Sie nichts über die Methode wissen, die zum Zeitpunkt der Kompilierung aufgerufen wird. Ich hatte gehofft, dass DWS so etwas macht. –

+0

Es ist im Moment nicht fertig, weil DWScript vollständig sandboxbar sein soll und Sicherheit anstrebt. Der Ansatz, den RemObject verwendet, führt zu Speicherbeschädigung oder stürzt ab, wenn die Parameter nicht übereinstimmen. Die RTTI ist ein bisschen weitergekommen, aber sie ist immer noch anfällig für Speicherlecks oder AV, da es keine Möglichkeit gibt, die Speicherverwaltung für Delphi-Ereignisse zu automatisieren. Wenn jemand mit diesen Einschränkungen leben und unterstützenden Code veröffentlichen kann, werde ich ihn integrieren ... mit entsprechenden "Vorsicht" -Anmerkungen ;-) –

Verwandte Themen