Может ли RTTI запрашивать типы из кода проекта во время разработки? - PullRequest
10 голосов
/ 30 января 2012

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

Ответы [ 2 ]

1 голос
/ 31 января 2012

Мое чтение источника RTTI.pas приводит меня к выводу, что Delphi RTTI не может проверить текущий проект IDE.Во время разработки RTTI может проверять типы внутри пакетов, размещенных в среде IDE.Он не может проверять дальше, чем это.

1 голос
/ 30 января 2012

Q: Можете ли вы узнать / использовать типы в Delphi IDE во время разработки?

A: Да, конечно:)

Q:Использует ли IDE напрямую RTTI?

AFAIK, "знание" IDE типов, методов и т. Д. Отличается от RTTI времени выполнения.AFAIK, это в равной степени относится, например, к самоанализу Java / IDE / отладчику Eclipse или .Net Reflection / IDE / отладчику MSVS.

Эта статья может помочь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...