Vraag Kan RTTI tijdens projectontwerp typen uit projectcode ondervragen?


Ik wil RTTI gebruiken om de typen in projectbronbestanden te onderzoeken op ontwerptijd in plaats van runtime.

Voor zover ik weet, wordt dit niet ondersteund, maar de discussie in de opmerkingen van deze vraag geven aan dat het mogelijk is en dat dit voor verschillende Delphi-versies is geweest. Dit is de eerste keer dat ik heb gehoord dat deze functionaliteit beschikbaar is en ik heb het tot nu toe niet voor mezelf kunnen reproduceren.

Hier is mijn testvoorbeeld. Het gebruikt een eenvoudig TListBox afstammeling TMyListBox welke een heeft string eigendom TypeToExplore welke wanneer ingevuld de keuzelijst vult met de eigenschappen van de gekwalificeerd typ de naam erin.

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.

Dit gebruiken TMyListBox component I

  • Compileer en installeer het in de Delphi XE IDE
  • Voeg de DCU-locatie van het component toe aan het IDE-bibliotheekpad
  • Start de IDE opnieuw om het zeker te weten
  • Maak een nieuwe leeg Project1
  • Laten vallen MyListBox1 naar TForm1
  • Opslaan, compileren en uitvoeren Project1
  • Sluit de Project1 toepassing (maar niet het project)
  • In de objectinspecteur ingesteld MyListBox1.TypeToExplore naar Unit1.TForm1

En de MyListBox1 rapporteert "Geen type gevonden" dat consistent is met mijn begrip van hoe RTTI werkt, dat wil zeggen dat het tijdens de ontwerpfase alleen typen kan verkennen die zich bevinden in pakketten die zijn geïnstalleerd in de IDE, niet in projectbronbestanden.

Als IDE inderdaad de mogelijkheid heeft om binnen projecten gedeclareerde typen te onderzoeken, wat mis ik dan?


10
2018-01-29 22:21


oorsprong


antwoorden:


Mijn lezing van de RTTI.pas-bron brengt mij tot de conclusie dat Delphi RTTI het lopende project van de IDE niet kan inspecteren. Tijdens het ontwerp kan RTTI soorten binnen pakketten die worden gehost door de IDE inspecteren. Het kan niet verder dan dat inspecteren.


1
2018-01-30 20:25



Vraag: Kun je tijdens het ontwerpen van de Delphi IDE vragen stellen / gebruiken?

A: Ja, natuurlijk :)

Vraag: maakt de IDE rechtstreeks gebruik van RTTI?

AFAIK, de "kennis" van de IDE van typen, methoden, enz. Is gescheiden en verschillend van runtime RTTI. AFAIK, dit is ook waar voor bijvoorbeeld Java introspection / de Eclipse IDE / debugger of .Net Reflection / de MSVS IDE / debugger.

Dit artikel kan helpen:


1
2018-01-29 22:24