参照が与えられた場合、対応するorIScriptObj
にどのように到達しますか?IInfo
TProgramInfo
Delphi オブジェクトをラップするスクリプト オブジェクトがあります。
スクリプト オブジェクトの存続期間を管理するために、Delphi オブジェクトはスクリプト オブジェクトへの参照を格納します。Script オブジェクトはTdwsUnit
コンポーネントで宣言されます。それはかなり標準的で、次のようになります。
デルファイ
type
TDelphiObject = class
private
FScriptObject: IScriptObj;
public
procedure DoSomething;
property ScriptObject: IScriptObj read FScriptObject write FScriptObject;
end;
脚本
type
TScriptObject = class
protected
procedure DoSomething; virtual;
public
constructor Create;
end;
Delphi オブジェクトのインスタンス化と Delphi/スクリプト リンクの設定は、スクリプト オブジェクト コンストラクタの Delphi 実装で行われます。また、かなり標準的です:
デルファイ
// Implements TScriptObject.Create
procedure TMyForm.dwsUnitClassesTScriptObjectConstructorsCreateEval(Info: TProgramInfo; var ExtObject: TObject);
var
DelphiObject: TDelphiObject;
DelphiObjectInfo: IInfo;
begin
// Create the Delphi-side object
DelphiObject := TDelphiObject.Create;
// Get the script object "self" value
DelphiObjectInfo := Info.Vars['self'];
// Store the ScriptObject reference
DelphiObject.ScriptObject := DelphiObjectInfo.ScriptObj;
// Return the instance reference to the script
ExtObject := DelphiObject;
end;
理想的には、後で必要なすべてを実行するのではなく、参照を保存したはずですが、経験から、オブジェクトIInfo
はメソッド呼び出しの間のみ有効であるようです。IScriptObj
IInfo
IInfo
とにかく、TDelphiObject.DoSomething
Delphi 側で が呼び出されたときに問題が発生します。
TDelphiObject.DoSomething
スクリプト オブジェクトで対応する仮想メソッドを呼び出すためのものです。
デルファイ
procedure TDelphiObject.DoSomething;
var
Info: IInfo;
DoSomethingInfo: IInfo;
begin
// I have a IScriptObj but I need a IInfo...
Info := { what happens here? };
// Call the virtual DoSomething method
DoSomethingInfo := Info.Method['DoSomething'];
DoSomethingInfo.Call([]);
end;
IInfo
使用可能なものを取得するため、またはTProgramInfo
保存されたものを取得するためにさまざまな手法を試しましたIScriptObj
が、すべてが失敗しました。それで、これを行う正しい方法は何ですか?