Может ли RTTI опросить типы из кода проекта во время разработки?

Я хотел бы использовать RTTI для изучения типов, содержащихся в исходных файлах проекта, во время разработки, а не во время выполнения.

Насколько мне известно, это не поддерживается, но обсуждение в комментариях этого вопроса указывает, что это возможно и было для нескольких версий Delphi. Это первый раз, когда я слышал о том, что эта функция доступна, но пока я не смог воспроизвести ее для себя.

Вот мой тестовый пример. В нем используется простой TListBox потомок TMyListBox, у которого есть свойство string TypeToExplore, которое при наборе заполняет поле списка свойствами квалифицированного имени типа, введенного в него.

unit MyListBox;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

type
  TMyListBox = class(TListBox)
  private
    FTypeToExplore : string;
    procedure SetTypeToExplore(const inValue: string);
    procedure FillWithTypeDetails;
  published
    property TypeToExplore : string read FTypeToExplore write SetTypeToExplore;
  end;

procedure Register;

implementation

uses
  RTTI, TypInfo;

procedure TMyListBox.SetTypeToExplore(const inValue: string);
begin
  if inValue = FTypeToExplore then
    Exit;

  FTypeToExplore := inValue;
  Clear;
  FillWithTypeDetails;
end;

procedure TMyListBox.FillWithTypeDetails;
var
  context : TRTTIContext;
  theType : TRttiType;
  properties : TArray<TRttiProperty>;
  prop : TRttiProperty;
begin
  theType := context.FindType(FTypeToExplore);
  if Assigned(theType) then begin
    properties := theType.GetProperties;
    for prop in properties do
      Items.Add(prop.Name);
  end else
    Items.Add('No type found');
end;

procedure Register;
begin
  RegisterComponents('Samples', [TMyListBox]);
end;

end.

Используя этот компонент TMyListBox I

  • Скомпилируйте и установите его в среду разработки Delphi XE
  • Добавить расположение компонента DCU в путь библиотеки IDE
  • Перезапустите среду IDE, чтобы убедиться, что
  • Создайте новый пустой Project1
  • Отбросьте MyListBox1 на TForm1
  • Сохранить, скомпилировать и запустить Project1
  • Закройте приложение Project1 (но не проект)
  • В инспекторе объектов установите MyListBox1.TypeToExplore в Unit1.TForm1

И MyListBox1 сообщает "No type found", который согласуется с моим пониманием того, как работает RTTI, то есть во время разработки он может только исследовать типы, которые содержатся в пакетах, установленных в среде IDE, а не в исходных файлах проекта.

Если IDE действительно имеет возможность проверять типы, объявленные в проектах, что мне не хватает?

Ответ 1

Мое чтение источника RTTI.pas приводит меня к выводу, что Delphi RTTI не может проверить текущий проект IDE. Во время разработки RTTI может проверять типы внутри пакетов, размещенных в среде IDE. Он не может проверить, что дальше.

Ответ 2

В: Можете ли вы спросить/использовать типы в Delphi IDE во время разработки?

A: Да, конечно:)

Q: Является ли IDE напрямую использовать RTTI?

AFAIK, IDE "знание" типов, методов и т.д. является отдельным и отличным от RTTI времени выполнения. AFAIK, это в равной мере относится, например, к интроспекции Java/Eclipse IDE/отладчику или .Net Reflection/MSVS IDE/отладчик.

Эта статья может помочь: