#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 в раздел инициализации модуля.