Я хотел бы использовать 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 действительно имеет возможность проверять типы, объявленные в проектах, что мне не хватает?