Příklad použití RTTI - výpis typů v programu

vložil Radek Červinka 20. října 2010 23:43

Zkoušel jsem si hrát s RTTI (Run Time Type Information) a byl jsem tak nadšen jednoduchostí použití, že výsledkem je jednoduchý program, který ve stromě zobrazuje známé typy včetně metod, property a polí. Zároveň ukazuje efektivní použití anonymních metod, generických typů a to vše na 100 řádcích včetně deklarace.

Strom s RTTI

Mějme formulář s TTreeView zarovnaným na celou plochu. V kódu formuláře bude následující kód.

    1unit Unit1;
    2
    3interface
    4
    5uses
    6  Forms, StdCtrls, ComCtrls, Classes, Controls, Generics.Defaults;
    7
    8type
    9  TForm1 = class(TForm)
   10    tv1: TTreeView;
   11    procedure FormCreate(Sender: TObject);
   12  private
   13    { Private declarations }
   14    procedure mFillTree;
   15  public
   16    { Public declarations }
   17  end;
   18
   19var
   20  Form1: TForm1;
   21
   22implementation
   23
   24{$R *.dfm}
   25
   26uses
   27  SysUtils, Rtti, Generics.Collections, TypInfo;
   28
   29procedure TForm1.FormCreate(Sender: TObject);
   30begin
   31  tv1.Items.BeginUpdate;
   32  try
   33    mFillTree;
   34  finally
   35    tv1.Items.EndUpdate;
   36  end;
   37end;
   38
   39procedure TForm1.mFillTree;
   40var
   41  ctx: TRttiContext;
   42  t: TRttiType;
   43  oNode, oTempNode: TTreeNode;
   44  arTypes: TArray<Rtti.TRttiType>;
   45  cmp:TDelegatedComparer<Rtti.TRttiType>;
   46  arMethods: TArray<TRttiMethod>;
   47  m: TRttiMethod;
   48  p: TRttiProperty;
   49  f: TRttiField;
   50
   51begin
   52
   53  ctx:= TRttiContext.Create;
   54  try
   55    // ziskej všechny zname typy
   56    arTypes := ctx.GetTypes;
   57
   58    // comparator za pomocí anonymní metody
   59    cmp := TDelegatedComparer<Rtti.TRttiType>.Create(
   60      function (const Left, Right: TRttiType): Integer
   61        begin
   62          Result := AnsiCompareStr(Left.QualifiedName, Right.QualifiedName);
   63        end);
   64
   65    // sort za pomoci vytvořeného porovnávače podle jmen
   66    TArray.Sort<Rtti.TRttiType>(arTypes, cmp); 
   67    cmp.Free;
   68
   69    // seřazené typy projdi přes for in do
   70    for t in arTypes do
   71    begin
   72      // uzel ve stromu pro typ
   73      oNode:= tv1.Items.AddChild(nil, t.QualifiedName);
   74
   75      // poduzel pro metody
   76      oTempNode := tv1.Items.AddChild(oNode, 'metody');
   77      for m in t.GetMethods do
   78        tv1.Items.AddChild(oTempNode, m.ToString);
   79
   80      // poduzel pro property
   81      oTempNode := tv1.Items.AddChild(oNode, 'property');
   82      for p in t.GetProperties do
   83        tv1.Items.AddChild(oTempNode, p.ToString);
   84
   85      // poduzel pro pole
   86      oTempNode := tv1.Items.AddChild(oNode, 'pole');
   87      for f in t.GetFields do
   88        tv1.Items.AddChild(oTempNode, f.ToString);
   89
   90    end;
   91  finally
   92    ctx.Free;
   93  end;
   94end;
   95
   96end.

Pěkná konstrukce je od řádku 58, kdy používáme obecný porovnávač (jeden z několika možných), ale vlastní implementace porovnávání je pomocí anonymní metody.

Deklarace TDelegatedComparer je v jednotce Generics.Defaults a vypadá takto (TDelegatedComparer je jen jedna z možností):

    1TComparison<T> = reference to function(const Left, Right: T): Integer;
    2
    3  TDelegatedComparer<T> = class(TComparer<T>)
    4  private
    5    FCompare: TComparison<T>;
    6  public
    7    constructor Create(const ACompare: TComparison<T>);
    8    function Compare(const Left, Right: T): Integer; override;
    9  end;

Zbytek kódu je podle mne jasný a přímočarý, případné dotazy do komentářů. Jo a pro kompilaci je nutné Delphi 2010 a vyšší.


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , ,

Praxe

Komentáře

21.10.2010 10:05:17 #

pingback

Pingback from topsy.com

Twitter Trackbacks for
        
        Delphi.cz | Příklad pouĹľitĂ­ RTTI - vĂ˝pis typĹŻ v programu
        [delphi.cz]
        on Topsy.com

topsy.com

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS