delphi DWScript - изменить значение переменной скрипта типа TObject во время скрипта - PullRequest
1 голос
/ 02 апреля 2012

У меня есть такой 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) и получить к ним доступв коде сценария через выходной.Но я хочу назначить Delphi-код, созданный экземпляр TOutputter без инициализации.

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

1 Ответ

0 голосов
/ 06 апреля 2012

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

Один из подходов к вышесказанному может состоять в том, чтобы просто добавить код вашей котельной к сценарию пользователя:

var Outputter := TOutputter.Create;

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

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

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

...