Как лучше всего выставить экземпляр класса в DWScript

Я собираю возможности встроенного скрипта, используя превосходный Pascal DWScript. Я также добавил свое собственное определение класса на стороне Delphi (TDemo) в DWScript, используя:

dwsUnit.ExposeRTTI( TDemo.ClassInfo  )

Это просто работает и является отличным способом быстрого добавления свойств и методов.

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

   dwsUnit.ExposeInstanceToUnit( 'Demo', 'TDemo', FDemo );

Это выглядит многообещающей процедурой для вызова, но я получаю AV из неинициализированной таблицы единиц измерения. Я также просмотрел код модульного теста источника SVN, чтобы увидеть использование этой функции, но безрезультатно. Может ли кто-нибудь указать мне, что я должен добавить/изменить?


person Brian Frost    schedule 25.08.2011    source источник
comment
Может быть, добавить какой-нибудь код в раздел initialization этого модуля?   -  person Johan    schedule 25.08.2011


Ответы (1)


ExposeInstanceToUnit необходимо использовать при инициализации таблицы TdwsUnit, см. RTTIExposeTests/ExposeInstancesAfterInitTable для примера кода. Это позволяет напрямую выставлять динамические экземпляры.

Другой подход заключается в использовании коллекции Instances компонента TdwsUnit. Вы получаете поддержку во время разработки и дополнительные возможности управления экземплярами и их временем существования.

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

редактировать: последний недавно добавленный подход заключается в использовании TdwsRttiConnector, который в основном позволяет открывать и подключаться ко всему, что доступно через RTTI. Это очень легко с точки зрения кода для настройки, но недостатком является то, что вы не получаете никаких проверок во время компиляции.

person Eric Grange    schedule 26.08.2011
comment
Спасибо, Эрик, это очень полезно. - person Brian Frost; 27.08.2011