Невозможно получить доступ к 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. Особенно для больших и сложных структур данных.
С нетерпением ждем тестирования вашего творения:)