1

私はこのようなDWScriptを持っています

var Outputter: TOutputter;

procedure OutputterTester;
begin
  Outputter.Print;
end;

TOutputter(複雑なクラスの単なる例です)は、デルファイコードで宣言および作成され、Rttiを介してDWScriptに公開されます。

TOutputter = class
  procedure Print;
end;

コンパイルされたスクリプトをいくつかのインスタンスに使用したいのですが、現在のインスタンスにリンクする値Outputterを変更します。次のコマンドでスクリプト変数にアクセスできることを知っています。

var Exec : IdwsProgramExecution;
...
AVar := Exec.Info.Vars['Outputter'].Value;

ただし、値はVariantであるため、オブジェクトを割り当てることはできません。どうすれば値を変更できますか?私が最初に次のようなスクリプトでクラスを作成した場合:

procedure Init;
   Outputter := TOutputter.Create;
end;

Exec.Info.Vars ['Outputter']。ScriptObj.ExtObjectにTOutputterの任意のインスタンス(delphiコードで作成)を割り当て、Outputterを介してスクリプトコードでそれらにアクセスできます。しかし、私はinit部分なしでTOutputterのデルファイコードで作成されたインスタンスを割り当てたいと思います。

助けてくれてありがとう!

4

1 に答える 1

0

私が正しく理解していれば、Initプロシージャをスキップしたいのですが、それがOutputterを外部変数または魔法の名前にする必要がある場合、それがどの変数であるかを認識できません。

上記の1つのアプローチは、ボイラープレートコードをユーザースクリプトの前に追加することです。

var Outputter := TOutputter.Create;

もう1つのオプションは、TdwsUnitに外部変数を作成することです。これにより、ユーザーがその外部変数にアクセスしたときにDelphi側からスクリプト側オブジェクトを作成し、ユーザーが何かを割り当てた場合に何が起こるかを処理できます。変数も同様です。

ただし、Outputterがユーザーによって読み取り専用であることが意図されている場合は、TdwsUnitでOutputter()関数を宣言するだけで済みます(そして、そこでスクリプトオブジェクトを作成して返します)。

最後のオプションは、RTTI環境を使用することです。これは、環境内のインスタンスを直接変更できるため、最も簡単なオプションです(RTTI環境の単体テストの1つがそれを行います)。

于 2012-04-06T08:16:06.857 に答える