Jak využít v Delphi TypeInfo, resp. RTTI

12. 12. 2013, Vladimír Klaus, přečteno 2574x

Delphi

Znáte to. Používáte množinu nějakých prvků pro interní účely a najednou někoho napadne, že by ty údaje chtěl zobrazovat.

Delphi RTTI

TStavOvereni = (soNovy, soNeniKorektni, soValidni, soValidniSDetaily, soNeniValidni, soChyba);

Nikdy jsem RTTI (Run-Time Type Information) nepotřeboval, ale toto je přesně ta chvíle, kdy se to bude hodit. Buď budete složitě programovat převodní funkci, nebo rovnou zobrazíte název prvku.

Od této chvíle se snažím jednotlivé prvky nazývat relativně normálně, abych si ušetřil programování pomocné funkce. Převod zařídí volání funkce GetEnumType.

uses
  TypInfo;

type
  TStavOvereni = (soNovy, soNeniKorektni, soValidni,
    soValidniSDetaily, soNeniValidni, soChyba);

var
  Stav: TStavOvereni;
  StrStav: string;

begin
  Stav:=soNeniKorektni;
  StrStav:=GetEnumName(TypeInfo(TStavOvereni), integer(Stav)); 
  //--StrStav bude obsahovat 'soNeniKorektni'
end;

Určitě by se výstup dal ještě více polidštit, což ale znamená změnu v pojmenování jednotlivých prvků.

uses
  TypInfo;

type
  TStavOvereni = (soNovy, soNeni_korektni, soValidni,
    soValidni_s_detaily, soNeni_validni, soChyba);

var
  Stav: TStavOvereni;
  StrStav: string;

begin
  Stav:=soNeni_korektni;
  StrStav:=GetEnumName(TypeInfo(TStavOvereni), integer(Stav));
  StrStav:=MidStr(StrStav, 3, maxint);
  StrStav:=StringReplace(StrStav,  '_',  ' ', [rfReplaceAll]);
  //--StrStav bude obsahovat 'Neni korektni'
end;

Samozřejmě můžete jít v některých jednodušších případech ještě dále a nadefinovat typ třeba takto. Pak je práce s prvky ještě snazší. Tedy až do chvíle, než se rozhodnete aplikaci lokalizovat. :-)

type
  TStavOvereni = (Nový, Nekorektní, Starý);

Velice podrobné povídání o RTTI najdete zde:

http://www.blong.com/Conferences/BorConUK98/DelphiRTTI/CB140.htm