Dato un riferimento IScriptObj
, come si arriva a uno IInfo
o TProgramInfo
corrispondente?DWScript: passaggio da IScriptObj a IInfo o TProgramInfo
Ho un oggetto di script che include un oggetto Delphi.
Per gestire la durata dell'oggetto di script, l'oggetto Delphi memorizza un riferimento all'oggetto di script. L'oggetto Script è dichiarato con un componente TdwsUnit
. E 'abbastanza standard e più o meno così:
Delphi
type
TDelphiObject = class
private
FScriptObject: IScriptObj;
public
procedure DoSomething;
property ScriptObject: IScriptObj read FScriptObject write FScriptObject;
end;
Script
type
TScriptObject = class
protected
procedure DoSomething; virtual;
public
constructor Create;
end;
l'istanza dell'oggetto Delphi e la configurazione dei collegamenti Delphi/script accade nel Implementazione di Delphi del costruttore di oggetti script. Anche abbastanza standard:
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;
Idealmente avrei risparmiato il riferimento IInfo
piuttosto che il IScriptObj
dal IInfo
fa tutto quello che ho bisogno in seguito, ma per esperienza sembra l'oggetto IInfo
è valida solo per la durata della chiamata al metodo.
In ogni caso, il problema si verifica in seguito quando TDelphiObject.DoSomething
viene richiamato sul lato Delphi. TDelphiObject.DoSomething
è destinato a richiamare il metodo virtuale corrispondente sull'oggetto script:
Delphi
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;
Ho provato molte tecniche diverse per ottenere una utilizzabile IInfo
o TProgramInfo
dallo stored IScriptObj
ma ogni cosa ha fallito. Allora, qual è il modo corretto di farlo?
Non ho molto expirience con DWScript ma sei sicuro di aver chiamato il tuo metodo di script nel modo giusto? Basata su un rapido sguardo su DWS Wiki (http://code.google.com/p/dwscript/wiki/FirstSteps#Functions), la chiamata corretta sarebbe "Info.Method ['DoSomething']. Call ([]); " – SilverWarior
Le due espressioni sono equivalenti; La proprietà 'Method []' restituisce un riferimento all'interfaccia 'IInfo'. – SpeedFreak
Puoi mostrare la dichiarazione di TProgramInfo? –