Я хотел бы использовать 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 IDE
- Добавьте расположение DCU компонента в путь к библиотеке IDE
- Перезапустите IDE, чтобы убедиться, что
- Создайте новый пустой
Project1
- Drop
MyListBox1
на TForm1
- Сохраните, скомпилируйте изапустите
Project1
- Закройте приложение
Project1
(но не проект) - В инспекторе объектов установите
MyListBox1.TypeToExplore
на Unit1.TForm1
ИMyListBox1
сообщает «Тип не найден», что согласуется с моим пониманием того, как работает RTTI, то есть во время разработки он может исследовать только типы, содержащиеся в пакетах, установленных в IDE, а не исходные файлы проекта.
Если в IDE действительно есть возможность проверять типы, объявленные в проектах, что мне не хватает?