3

尝试使用本文中定义的Smart 的 RTTI ,我无法让 RTTI 发送到 HTML。

当我定义:

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

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

然后,没有可用于此类的 RTTI。

在 index.html 中,我有:

var $RTTI = [];

这意味着没有发出 RTTI。

这发生在我设置的任何项目选项中。(简而言之,RTTI 编译选项没有任何区别)

我正在使用短信 2.0.1.741。

我坚持为mORMot实现本机 SMS 客户端。

4

3 回答 3

3

在最新的修补程序中似乎存在与此问题有关的错误。我已经向开发团队报告了这个问题,应该很快就会解决。我注意到自己在不同版本的 SMS 上测试 RTTI 方法时发生了完全相同的事情。

一个直接的解决方案是回滚到版本 2.0.0.723。

您可以在此处下载该版本:http: //smartmobilestudio.com/download/v2_0_0_723/

于 2014-06-22T14:47:24.770 回答
3

我发现它在主单元(TApplication)中有效,但在其他引用单元中无效。所以你可以同时试试

于 2014-06-23T18:36:23.617 回答
0

作为自动持久性的替代方案(因为 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 属性映射更好(并且应该很快修复),但是对于手动执行它的框架 - 这确实比完全自动化有一些优势 - 对于像你这样的创造性程序员来说,有很多选择。

还需要考虑速度,并且与 for/next 递归算法相比,使用 JavaScript 对象作为查找表非常非常快。特别是对于大型和复杂的数据结构。

期待测试您的创作:)

于 2014-06-24T11:46:09.773 回答