Használata felsorolt ​​típusok delphi

Szóval, mi az RTTI.
Runtime Type Information vagy sokrashenno RTTI (runtime milyen típusú adatokat is) által generált adatokat Delphi fordító program-objektumokat. RTTI egy nyelvi funkció, amely információt nyújt a tárgyak a kérelem (név, például méret, egy mutatót ős osztály, az osztály nevét, és így tovább. D.) és az egyszerű típusok futásidőben. Delphi, például használ RTTI eléréséhez ingatlan értékének komponens tárolni és olvasni DFM-fájlokat, és megjeleníti őket az Object Inspector.
Az alapvető definíció típusok, az alapvető funkciókat és eljárásokat dolgozni futásidejű információk TypInfo modult. Ez a modul két alapvető szerkezetét használható RTTI - TTypeInfo és TTypeData (típusú mutatókat őket - PTypeInfo és PTypeData -kal). Javasoljuk, hogy használja őket egy konkrét példát.
Tegyük fel, hogy meg kell, hogy egy query string mellett a Google, hozzáférhet az API. Mit tanulhatunk a dokumentációt a ClientLogin?
1. Ez az, amit a paraméterek, mint ACCOUNTTYPE, és lehet, hogy meglehetősen sajátos értékeket is képviseli két felsorolt ​​adattípusok:

írja TAccountType = (GOOGLE, üzemeltetett HOSTED_OR_GOOGLE) típusú TServices = (xapi, analitika, alkalmazások, gbase, JotSpot, blogger, nyomtatás, cl, codesearch, cp, Writely, pénzügy, e-mail, az egészségügy, a helyi, LH2, annotateweb, bölcs , webhelytérképek, youtube);

2. A szerver is tartalmazhat korlátozott számú értékei (kódok) és a hiba értéke 1 ( «OK») sikeres hitelesítést követően. Ezért azt, hogy egy másik adat típusa:

típusú TErrorCodes = (Ok, BadAuthentication, NotVerified, TermsNotAgreed, CaptchaRequired, ismert, AccountDeleted, AccountDisabled, ServiceDisabled, ServiceUnavailable);

Most, hogy minden a felsorolt ​​adattípusok meghatározása, van egy egyszerű kérdésre: „Mi a következő lépés?”. Bármennyire is tettünk, például a kialakulását a query string, ha tudnám, hogy egyáltalán semmit nem RTTI és TypInfo egység különösen?
Legalább mi lenne megszervezni, valahogy így:

var Paraméter: string; AccType: TAccountType; kezdődik esetén AccType a Google: ParamStr: = 'valami van-AccauntType = GOOGLE'; HOSTED: ParamStr: = 'valami van-AccauntType = HOSTED'; HOSTED_OR_GOOGLE: ParamStr: = 'valami van-AccauntType = HOSTED_OR_GOOGLE'; végén; végén;

Nagyjából ugyanezt tekintetében TServices. Vajon ez a kód működik? Természetesen lesz ... hol nafig megy sehova. De ez is lehet másképpen.
A következő módszer meghatározott TypInfo modulban:

függvény GetEnumName (TypeInfo: PTypeInfo; Érték: Egész szám): string;

Értékét adja vissza a felsorolt ​​típus, mint egy egyszerű karakterlánc. Az első paraméter - a mutató egy rekord TTypeInfo. második - értékek számát a listákon az adatok típusát.
Azaz, a végrehajtó a következő kódot:

Majd kap egy üzenetet, amely tartalmazza a húr «HOSTOLT». Most, hogy ezt az eljárást, tudjuk csökkenteni a fenti kódot, hogy csak egy sort:

var Paraméter: string; AccType: TAccountType; kezdődik ParamStr: = 'valami van-ACCOUNTTYPE =' + GetEnumName (TypeInfo (TAccountType), ord (AccType)); végén;

Vagy, ha használ valamilyen sablon kialakulását egy sor, az alábbiak szerint:

var Paraméter: string; AccType: TAccountType; kezdődik ParamStr: = Format (Shablon, [GetEnumName (TypeInfo (TAccountType), ORD (AccType)]); end;

Most tegyük fel, hogy már kialakult a query string, küldtünk egy kérést a szerver, és kap vissza a választ, amely tartalmazza az „OK” vagy egy hibakód húr. És szükségünk van valamilyen típusú változó TErrorCodes értéket rendelni szerint a válasz. Ismét mit tennénk ismerete nélkül a TypInfo, fogadó, például «NotVerified» hibakód? Valaki elkezdett festeni egy csomó if..then..else, vagy használja AnsiIndexStr eljárás StrUtils modul, majd hasonlítsa össze a kapott értéket az érték a megbízás típusától, mint ez:

var ERRCODE: TErrorCodes; kezdődik ERRCODE: = TErrorCodes (AnsiIndesStr (MassivStrok, "NotVerified")); végén;

Ismét minden a helyére kerül, de miért húzza maga mögött egyszer StrUtils modul uses, amikor mi már TypInfo? Mi egy másik módszerrel dolgozó felsorolt ​​típusok:

függvény GetEnumValue (TypeInfo: PTypeInfo; const Név: string): integer;

A módszer adja vissza az értékek egy felsorolás típusa. A bemeneti még mindig ugyanaz, és a mutatót TTypeInfo sorrendi érték típusú karakterlánc. Csak az, amit akarunk. Ennek eredményeként a GetEnumValue kódrészlet felett leírható a következő:

08/05/02
UPDATE: egy kisméretű - a funkció GetEnumValue és GetEnumName nem dobja kivétel abban az esetben, ha meg a második paraméter érvénytelen sor van vagy nincs olyan elem indexe. Az első esetben, akkor egyszerűen vissza GetEnumValue 255 és GetEnumName érthetetlen húr.

UPDATE. Ha a felsorolt ​​tényezőket típus nem 0-val kezdődik, mint a normál, és például 3, megkapjuk fordításkor hiba «ERROR:«E2134: Típus »TMyEnum« nincs typeinfo»»

Kapcsolódó cikkek