Ответ 1
Мое чтение источника RTTI.pas приводит меня к выводу, что Delphi RTTI не может проверить текущий проект IDE. Во время разработки RTTI может проверять типы внутри пакетов, размещенных в среде IDE. Он не может проверить, что дальше.
Я хотел бы использовать 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
Project1
MyListBox1
на TForm1
Project1
Project1
(но не проект)MyListBox1.TypeToExplore
в Unit1.TForm1
И MyListBox1
сообщает "No type found", который согласуется с моим пониманием того, как работает RTTI, то есть во время разработки он может только исследовать типы, которые содержатся в пакетах, установленных в среде IDE, а не в исходных файлах проекта.
Если IDE действительно имеет возможность проверять типы, объявленные в проектах, что мне не хватает?
Мое чтение источника RTTI.pas приводит меня к выводу, что Delphi RTTI не может проверить текущий проект IDE. Во время разработки RTTI может проверять типы внутри пакетов, размещенных в среде IDE. Он не может проверить, что дальше.
В: Можете ли вы спросить/использовать типы в Delphi IDE во время разработки?
A: Да, конечно:)
Q: Является ли IDE напрямую использовать RTTI?
AFAIK, IDE "знание" типов, методов и т.д. является отдельным и отличным от RTTI времени выполнения. AFAIK, это в равной мере относится, например, к интроспекции Java/Eclipse IDE/отладчику или .Net Reflection/MSVS IDE/отладчик.
Эта статья может помочь: