5

我想知道 DWScript 是否支持使用脚本方法作为 Delphi 表单上的控件的事件处理程序。例如,我想将 TButton OnClick 事件链接到脚本中存在的方法。

我可以通过调用返回 TMethod 对象的 GetProcMethod 来使用 RemObjects Delphi 脚本引擎执行此操作。然后我使用 SetMethodProp 将脚本方法分配给按钮的 OnClick 事件。

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

  SetMethodProp(Instance, SourceMethodName, ScriptMethod);
end;

我想在 DWScript 而不是 Rem 对象脚本引擎中执行此操作,因为它执行我需要的其他一些东西。

4

2 回答 2

2

我决定改用 RemObjects。它是最容易使用的并且可以满足我的需要。

于 2012-10-30T04:03:17.227 回答
1

AFAIK DWScript 不直接支持您要实现的目标,但可以以不同的方式实现。我将尝试发布一些如何实现它的源代码,但您可能需要根据您的需要对其进行调整。

首先,声明一个小包装类,它应该为每个脚本方法分开:

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;

现在我们必须在代码中的某处创建这个类的实例(例如在表单的创​​建事件中):

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;

现在,当我们调用 MainClick 时,我们的脚本被编译并执行:

从表单事件执行的脚本方法

于 2012-10-02T14:21:45.350 回答