首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi Web Script (DWScript)将脚本方法链接到外部控件事件

Delphi Web Script (DWScript)将脚本方法链接到外部控件事件
EN

Stack Overflow用户
提问于 2012-09-23 12:03:33
回答 2查看 1.1K关注 0票数 5

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

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

代码语言:javascript
运行
复制
procedure LinkMethod(SourceMethodName: String; Instance: TObject; ScriptMethodName: String);
var
  ScriptMethod: TMethod;
begin
  ScriptMethod := ScriptEngine.GetProcMethod(ScripMethodName);

  SetMethodProp(Instance, SourceMethodName, ScriptMethod);
end;

我想在DWScript中做这件事,而不是使用Rem objects脚本引擎,因为它可以做一些我需要的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 12:03:17

我决定转而使用RemObjects。它是最容易使用的,而且能做我需要的事情。

票数 2
EN

Stack Overflow用户

发布于 2012-10-02 22:21:45

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

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

代码语言:javascript
运行
复制
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;

现在,我们必须在代码中的某个地方创建该类的实例(例如,在窗体的create事件中):

代码语言:javascript
运行
复制
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时,我们的脚本被编译并执行:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12549625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档