2012-09-23 16 views
5

Me pregunto si DWScript admite el uso de un método de secuencia de comandos como un controlador de eventos para un control en un formulario Delphi. Por ejemplo, quiero vincular un evento TButton OnClick a un método que existe en el script.Delphi Web Script (DWScript) vincula un método de secuencia de comandos a un evento de control externo

Puedo hacer esto con el motor de script RemObjects Delphi llamando a GetProcMethod que devuelve un objeto TMethod. Luego uso SetMethodProp para asignar el método de script al evento OnClick de un botón.

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

    SetMethodProp(Instance, SourceMethodName, ScriptMethod); 
end; 

Me gustaría hacer esto en DWScript en lugar del motor de scripts Rem Objects ya que hace otras cosas que necesito.

Respuesta

2

Decidí ir con RemObjects en su lugar. Fue el más fácil de usar y hace lo que necesito.

1

AFAIK DWScript no es compatible directamente con lo que está tratando de lograr, pero podría implementarse de manera diferente. Trataré de publicar un código fuente sobre cómo podría implementarse, pero es probable que deba adaptarlo a sus necesidades.

En primer lugar, declarar una pequeña clase de contenedor que debe ser independiente para cada método de secuencia de comandos:

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; 

Ahora tenemos que crear una instancia de esta clase en algún lugar de nuestro código (por ejemplo, en caso de creación de formulario):

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; 

Ahora cuando llamamos MainClick nuestro guión se compila y ejecuta:

Script method executed from form's event

+1

Gracias por eso. Lamentablemente, sin embargo, no sabré el nombre del evento de los parámetros necesarios hasta el tiempo de ejecución. RemObjects maneja la interceptación de la llamada al evento y el reenvío de los parámetros al controlador de eventos con guiones. De esta forma, no necesita saber nada sobre el método invocado en tiempo de compilación. Esperaba que DWS hiciera algo como esto. –

+0

No está hecho en este momento porque DWScript está destinado a ser completamente sandboxable y apunta a la seguridad, el enfoque que utiliza RemObject provocará daños en la memoria o fallas si hay una falta de coincidencia entre los parámetros. El RTTI ha progresado un poco en eso, pero seguirá siendo vulnerable a fugas de memoria o AV, ya que no hay forma de automatizar la administración de memoria para eventos Delphi. Si alguien puede vivir con esas limitaciones y publicar código de apoyo, lo integraré ... con avisos de "precaución" apropiados ;-) –

Cuestiones relacionadas