12.12.2013, Vladimír Klaus, navštíveno 5066x
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.
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