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;

Rem オブジェクト スクリプト エンジンではなく、DWScript でこれを実行したいと考えています。これは、必要な他の処理を実行するためです。

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;

次に、コードのどこかにこのクラスのインスタンスを作成する必要があります(たとえば、フォームのcreateイベントで)。

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 に答える