FireMonkey, получающий FMXObjects во время выполнения с использованием RTTI

#delphi #rtti

#delphi #rtti

Вопрос:

Я пытаюсь получить (с помощью RTTI ) те forms объекты, которые есть в моем приложении, чтобы создавать их в runtime , на основе форм Name .

Я объявил {$TYPEINFO ON} директиву компилятора и я закодировал:

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

но я получаю nil результат.

'Forms.tForm' должны ли быть формы Name ?

Любая помощь будет оценена.

Ответ №1:

Как говорится в документации:

TRttiContext.FindType , который ищет информацию о типе на основе точного имени типа. Точное имя типа состоит из двух компонентов: имени модуля, отделенного символом точки от имени типа (например, Classes.TStrings ).

Полная QualifiedName поддержка TForm фреймворка Firemonkey будет: 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.TForm является TPersistent потомком, который компилируется с помощью директивы {$M }, которая является псевдонимом {$TYPEINFO ON} . Таким образом, вам не нужно будет включать его для доступа к TForm RTTI

Комментарии:

1.Спасибо, это сработало. Теперь, как я уже говорил ранее, как я могу найти FMX form , основываясь на его имени?

2. Вы просто используете полное имя. Точное имя принадлежит классу. Если ваш класс объявлен в MyUnit как TMyForm = class(TForm), то соответствующим именем будет MyUnit. TMyForm

3. Спасибо за совет. Случается, что RTTI это не может помочь мне достичь моей цели, которая заключается в извлечении, forms используя его names . Это потому, что (как подтверждает мой тест), forms должны быть созданы первыми, чтобы RTTI можно было найти любую информацию о них. Поэтому я просто настраиваю их автоматическое создание в Options->Forms настройках.

4. Я не совсем понимаю, что вы имеете в виду. Чего вы на самом деле пытаетесь достичь? RTTI означает информацию о типе среды выполнения. То есть он предоставляет вам информацию о заданном типе. Не об экземпляре объекта.

5. @ppro — чтобы RTTI был доступен, на класс где-то должна быть ссылка, иначе интеллектуальный компоновщик удалит его и любой связанный RTTI. Один из способов ссылаться на класс — создать его экземпляр, но это не единственный способ — достаточно просто добавить TMyForm.className в раздел инициализации модуля.