3

メイン フォームで作成されたクラスからプロシージャを呼び出すにはどうすればよいですか。この擬似コードが示すように実行できますか?

type
  TDemo = class
    procedure test;
    constructor Create;
    destructor Destroy; override;
  end;

var
  Form28: TForm28;
  Demo:TDemo;

implementation

{$R *.dfm}

procedure TForm28.Button1Click(Sender: TObject);
var
   prog : IdwsProgram;
   exec : IdwsProgramExecution;
begin
   Demo := TDemo.Create;
   prog := DelphiWebScript1.Compile('Demo.Test;');
   exec := prog.Execute;
end;
4

2 に答える 2

2

制限付きの RTTI エクスポーザと RTTI コネクタがあり、RTTI を介して Delphi クラスにアクセスできます。

ただし、ほとんどの Delphi クラスはスクリプトに使用するのが「安全」ではないため、これらの RTTI ツールはあまり調査されていません。つまり、ホストをクラッシュさせたり、メモリ リークを起こしたりするのは簡単です。そのため、「生の」Delphi クラスは通常、エンド ユーザーのスクリプト作成には適していません(つまり、エンド ユーザーにはエラーを起こす権利が​​なく、安定したデバッグを提供するためなど)。

TdwsUnit のイベント ハンドラーで公開されたクラスを手動で公開および強化する代わりに、クラスを OLE オートメーション オブジェクトとして公開し、DWScript COM コネクタを使用してそれらにアクセスできます。利点は、オートメーション オブジェクトを公開するために、通常は、メモリ リークやダングリング ポインターに対して少なくとも最小限の強化を行う必要があり、他の COM 対応環境からオートメーション クラスにアクセスできることです。

RTTI がうまくいかない例として、TComponent や TCollection などの完全に自動管理された VCL クラスを考えてみましょう。生の RTTI エクスポージャーしかない場合は、次のようなスクリプトではありません。

item := myCollection.Add;
myCollection.Clear;
item.Caption := 'hello bug';

ホスト アプリケーションでメモリがランダムに上書きされ、潜在的なエラーについてスクリプト ユーザーに通知する安全な方法はありません。

今後の Delphi ARC コンパイラは、一部のクラスのメモリの上書きを軽減する方法を提供する可能性があります(すべてではないですが、ARC が現在 TComponent などで実装/回避されている方法のため)。また、Delphi ARC コンパイラは現在サポートされていません (さまざまな理由から、最も顕著な理由は、現在アクセスできないことです)。

于 2013-10-05T19:00:10.040 に答える
1

これを行うには、まずネイティブ クラスをスクリプト エンジンに公開する必要があります。TdwsUnitコンポーネントを見てみましょう。外部コードとのインターフェイスとなるスクリプト ユニットを宣言します。1 つをフォームにドロップし、クラスを定義し、そのメソッドを定義してOnEval、外部ルーチンを呼び出すイベントにイベント ハンドラーを接続します。

于 2013-10-04T17:20:02.300 に答える