Может ли 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;
  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

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

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

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

10
задан Community 23 May 2017 в 09:59
поделиться