delphi DWScript - изменить значение переменной скрипта типа TObject во время выполнения скрипта

У меня есть такой DWScript

var Outputter: TOutputter;

procedure OutputterTester;
begin
  Outputter.Print;
end;

TOutputter (это всего лишь пример сложного класса) объявлен и создан в коде Delphi и доступен для DWScript через Rtti.

TOutputter = class
  procedure Print;
end;

Я хочу использовать скомпилированный скрипт для нескольких экземпляров, но изменить значение Outputter, которое он связывает с текущим экземпляром. Я знаю, что могу получить доступ к переменной сценария с помощью:

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

Но значение является вариантом, поэтому я не могу назначить объект. Как я могу изменить значение? Если я сначала создам класс в сценарии, например:

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

Я могу назначить Exec.Info.Vars['Outputter'].ScriptObj.ExtObject произвольный экземпляр TOutputter (созданный в коде Delphi) и получить к ним доступ в коде скрипта через Outputter. Но я хочу назначить созданный код Delphi экземпляр TOutputter без части инициализации.

Спасибо за помощь!


person DragonFlyOfGold    schedule 02.04.2012    source источник
comment
Что такое TOutputter? класс? запись? псевдоним типа? Кроме того, кто отвечает за создание объекта на стороне скрипта и кто отвечает за поддержку объекта на стороне Delphi за этим объектом на стороне скрипта? (под кем я подразумеваю скрипт? код Delphi? что-то еще?)   -  person Eric Grange    schedule 03.04.2012
comment
Я скорректировал свой вопрос, чтобы ответить на неясные факты. Спасибо за помощь!   -  person DragonFlyOfGold    schedule 03.04.2012


Ответы (1)


Если я правильно понял, вы хотите пропустить процедуру Init, но если это означает, что вы должны сделать Outputter либо внешней переменной, либо магическим именем, иначе вы не сможете распознать, какая это переменная.

Одним из подходов к вышеизложенному может быть просто добавление вашего стандартного кода к пользовательскому скрипту:

var Outputter := TOutputter.Create;

Другим вариантом может быть создание внешней переменной в TdwsUnit, тогда вы будете нести ответственность за создание объекта на стороне скрипта со стороны Delphi, когда пользователь обращается к этой внешней переменной, и можете обрабатывать то, что произойдет, если пользователь назначит что-то для тоже переменная.

Но если Outputter предназначен для пользователя только для чтения, вы можете просто объявить функцию Outputter() в TdwsUnit (и создать и вернуть туда объект скрипта).

Последним вариантом будет использование среды RTTI, в зависимости от того, что вы хотите с ней делать, это может быть самый простой вариант, поскольку вы можете напрямую изменить экземпляр в среде (это делает один из модульных тестов для среды RTTI).

person Eric Grange    schedule 06.04.2012