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