【问题标题】:FireMonkey Getting FMXObjects at runtime using RTTIFireMonkey 在运行时使用 RTTI 获取 FMXObjects
【发布时间】:2016-10-23 22:00:34
【问题描述】:

我正在尝试获取(使用RTTI),在我的应用程序中的forms,以便根据Name 的形式在runtime 创建它们。

我已经声明了{$TYPEINFO ON} 编译器指令并进行了编码:

 lRttiType := pRttiContext.FindType ('Forms.tForm');

但我得到了nil 结果。

'Forms.tForm' 应该是Name 的形式?

我们将不胜感激。

【问题讨论】:

    标签: delphi rtti


    【解决方案1】:

    正如documentation 所说:

    TRttiContext.FindType,根据限定类型名查找类型信息。限定类型名称由两部分组成:单位名称,由类型名称中的点字符分隔(例如,Classes.TStrings)。

    Firemonkey 框架的TForm 的完整QualifiedName 将是:FMX.Forms.TForm

    请注意,QualifiedName 区分大小写。

    lRttiType := pRttiContext.FindType ('FMX.Forms.TForm'); // this finds the TRttiType
    lRttiType := pRttiContext.FindType ('fmx.forms.TForm'); // this will return nil
    

    还要注意,FMX.Forms.TFormTPersistent 的后代,它是使用 {$M+} 指令编译的,它是 {$TYPEINFO ON} 的别名。因此,您无需启用它即可访问TForm RTTI

    【讨论】:

    • 谢谢,它成功了。现在,正如我之前所说,如何根据名称找到FMX form
    • 您只需使用限定名称。限定名称属于一个类。如果您的类在 MyUnit 中声明为 TMyForm = class(TForm) 则限定名称将为 MyUnit.TMyForm
    • 感谢您的提示。碰巧RTTI 无法帮助我实现我的目标,即使用其names 检索forms。那是因为(正如我的测试所证实的),forms 必须首先创建,以便RTTI 可以找到有关它们的任何信息。所以我只是将它们设置为自动创建,在 Options->Forms 设置中。
    • 我不太明白你的意思。你到底想达到什么目的? RTTI 代表运行时类型信息。也就是说,它为您提供有关给定类型的信息。与对象实例无关。
    • @ppro - 要使 RTTI 可用,需要在某处引用一个类,否则智能链接器将删除它和任何关联的 RTTI。引用类的一种方法是实例化它,但这不是唯一的方法 - 只需在单元的初始化部分添加 TMyForm.ClassName 即可。
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2013-07-30
    • 2012-06-23
    • 2011-11-30
    • 1970-01-01
    • 2020-12-26
    • 2023-03-21
    • 2014-03-31
    相关资源
    最近更新 更多