Невозможно получить доступ к RTTI для SmartMobileStudio

Пытаясь использовать RTTI Smart, как определено в этом посте, я не смог позволить RTTI быть переданным в HTML.

Когда я определяю:

type
   TBase = class
      published
         Field : Integer = 1;
   end;

 var base := new TBase;
 PrintPropertiesForType(base);

Тогда нет RTTI для этого класса.

В index.html у меня есть:

var $RTTI = [];

Это означает, что RTTI не излучается.

Это происходит для всех параметров проекта, которые я установил. (короче говоря, опция компиляции RTTI не имеет никакого значения)

Я использую SMS 2.0.1.741.

Я застрял с реализацией родного клиента SMS для mORMot..

3 ответа

Решение

Кажется, есть ошибка с этой проблемой в последнем исправлении. Я сообщил о проблеме команде разработчиков, и она должна быть исправлена ​​в ближайшее время. Точно такую ​​же вещь я заметил, тестируя методы RTTI на разных версиях SMS.

Немедленное решение - просто откатиться до версии 2.0.0.723.

Вы можете скачать эту версию здесь: http://smartmobilestudio.com/download/v2_0_0_723/

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

В качестве альтернативы автоматическому сохранению (поскольку RTTI не работает в последнем исправлении, и вы решили не использовать RTTI для сопоставления объектов), следует отметить, что Smart Pascal поддерживает структуры JavaScript. Это значительно упростит хранение объектов. Если вы когда-либо использовали пакет свойств Microsoft (класс com), то это более или менее одно и то же.

В JavaScript вы бы написали:

var mbag = {};
mbag["test"] = {};
mbag["test"]["somevalue"] = 12;
mBag["text"] = "this is a string value";

В результате структура памяти, как это:

Type
TMyBagContent = Record
  bcTest = Record
             bcSomeValue:Integer;
           end;
  bcText:String;
End;

В Delphi такие структуры реализованы в SuperObject (я считаю). RemObjects также имеет несколько классов поддержки, которые имитируют это. Но, к счастью, Smart Pascal достигает этого автоматически благодаря изящному таргетингу на JavaScript.

Таким образом, в Smart Pascal вы бы сделали следующее для достижения тех же результатов:

var mBag:Variant;
mBag:=TVariant.CreateObject;
mBag['test'] := TVariant.CreateObject;
mBag['test']['somevalue']:=12;
mBag['text']:='this is a string';

Вы также можете сэкономить время и использовать раздел сборки:

var mBag:variant;
asm
  @mbag = {};
  @mbag["test"] = {};
  @mbag["test"]["somevalue"] = 12;
  @mbag["text"] = "this is a string value";
end;

После того, как вы заполнили данные вашего объекта, вы затем используете JSON для сериализации и создания переносимости:

var mObj: String;
asm
  @mObj = JSON.stringify(@mbag);
end;

Создать класс чтения / записи для хранения очень просто. Естественно, автоматическое сопоставление свойств RTTI лучше (и это должно быть исправлено в ближайшее время), но для фреймворков, которые делают это вручную - что имеет некоторые преимущества по сравнению с полной автоматизацией - есть много вариантов для творческих программистов, таких как вы.

Также необходимо учитывать скорость, и использование объекта JavaScript в качестве таблицы поиска очень и очень быстро по сравнению с рекурсивным алгоритмом for / next. Особенно для больших и сложных структур данных.

С нетерпением ждем тестирования вашего творения:)

Другие вопросы по тегам