Első információk a fajta RTTI
RegisterClasses ([TButton, TForm, TListBox, TPaintBox, TFindDialog, TOpenDialog, TTimer, TComponent, TGraphicControl]);
Egy példa használatát szemléltető RTTI a CLX-hez kapcsolódik CD
CLX a könyvtárban ezt a fejezetet.
Ebben a fő formája három listákat. LbSampClasses lista tartalmazza a nevét több osztálya tárgyak információt a típus, amely szeretné, hogy a padló chit. Amikor kiválaszt egy objektumot a listáról a lbSampClasses lbBaseClassInfo listája kopott alapvető információkat méretét és eredetét a tárgy és lbPropList lista - információk a tulajdonságait a kiválasztott obekta.Dlya információit osztály használ három kiegészítő leeresztő
• GetBaseClassInfo () - kitölti egy listát az alapvető információkat a tárgyak
e - a típusa, mérete, a modul, amelyben definiálva van, és a szám a tulajdonságok.
• GetClassAncestry () - kitölti a lista objektum nevét ősök.
• GetClassProperties () - kitölti egy listát a tulajdonságait osztály és típusai.
Minden eljárást használunk paraméterként egy objektum példány, és egy listát a szálakat.
Amikor a felhasználó kiválasztja az egyik osztály a listában lbSampClasses a leeresztő ra feldolgozó események onclick (lbSampClassesClick ()) okozza a kiegészítő CreateAClass () függvény, amely létrehoz egy példánya a típusát az adott osztály nevét. Ezután, az objektum példány át a cél, hogy egy kívánt alvási levet megadott értéket a megfelelő tulajdonságok TListBox.Items.
CreateAClass () függvény hozzon létre egy osztályt a neve. De, mint már a SKA Zano átadni ennek a függvénynek paraméterként osztály regisztrálnia kell magát a RegisterClasses () eljárást.
Első információk a típusú objektumok
GetBaseClassInfo () eljárás továbbítja a visszatérési érték TOb- ject.ClassInfo (), GetTypeData () függvény definiált TypeInfo.pas modulban. Ez az eljárás visszatér egy pointert TTypeData építmény egy osztály, amelynek szerkezetét hozzárendelve PTypeInfo ezt az eljárást (lásd. Példa 10-2). Mintegy eljárás GetBaseClassInfo () csak arra utal, hogy a különböző területeken és struktúrák TTypeInfo TTypeData AStrings bővíteni a listát. Figyeljük meg a GetEnumName () függvény egy sztring úgynevezett felsorolt típus. Ez ugyanaz a RTTI függvény definiált TypInfo.pas fájlt. Mintegy RTTI felsorolt típusok leírása a következő részben.
Használata GetTypeData () függvény definiált TypInfo.pas fájl megszerzése egy mutatót a struktúra TTypeInfo ebbe az osztályba. Eredmény TObject.ClassInfo () függvényhívás kell átutalni GetTypeData () függvényt. BOARD
Ahhoz, hogy a neve a felsorolt típus képviseli, mint egy húr, fel tudjuk használni GetEnumName () függvényt. GetEnumValue () függvény értéke egy felsorolt típus egy adott nevet.
Első információk eredetét a tárgy
GetClassAncestry () eljárás kitölti sorban nevek listája alaposztályok az objektum. Ez egy viszonylag egyszerű művelet, eljárás alkalmazásával ClassPar- ent (), a tárgy és visszaad egy pointert a szülő osztály típusát TClass vagy nulla, ha eléri a tetején a öröklődési hierarchia (nagyszülő osztály). GetClassAncestry Eljárás () „fut” az egész öröklődési hierarchia és hozzáadja az alap osztály nevét (ősök) a megfelelő lista sorokat.
Első információk a fajta objektum tulajdonságai
Ha az objektum tulajdonságai, amely megfelel az érték TTypeData.PropCount a teljes. Számos megközelítés, hogy információt nyerjünk a tulajdonságait az osztályban, de csak kettőt.
GetClassProperties () eljárás indul, ugyanúgy, mint az előző két IU Toda, - a GetTypeData () függvény eredményének továbbítására ClassInfo () függvény, hogy a mutató az osztály szerkezetét TTypeData. Ezután, értéke alapján ClassTypeData.PropCount, memóriát a változó a proplist, lennoy meghatározni, mint egy mutató egy tömb PPropList, ami viszont, határozza TypeInfo.pas modulban:
TPropList = array [0..16379] a PPropInfo;
TPropList tömb tárolja mutató adatok TPropInfo egyes ingatlanok. típus
TPropInfo TypeInfo.pas modulban meghatározott az alábbiak szerint:
PPropInfo = ^ TPropInfo; TPropInfo = csomagolt rekord
PropType: PPTypeInfo; GetProc: Pointer; SetProc: Pointer; StoredProc: Pointer; Index: Integer; Alapértelmezett: Longint; NameIndex: smallint; Név: ShortString;
TPropInfo mező információt a tulajdon típusa.
GetClassProperties () eljárás használ GetPropInfos () funkció
töltse tömb mutató RTTI információt a tulajdonságait
objektumot. Ezután egy hurok megy keresztül az összes elemet a tömb, elolvassa a nevét és típusát a tulajdonságait a mindenkori RTTI adatokat. Megjegyzés: a következő sort:
ha nem (proplist [i] ^. PropType ^ .Kind = tkMethod), majd
Használja GetPropInfos () függvény, ha azt akarjuk, hogy a mutató a infor- CIÓ RTTI összes objektum tulajdonságait. További információk a szigetek tulajdonságai egy bizonyos típusú, használja GetPropList () függvényt.
Ábra. 10.3 ábra a fő formája az információt a fajta futás közben.

Ábra. 10.3.Glavnaya formájában tájékoztatást a fajta
Annak ellenőrzése, hogy az objektum tulajdonságait bizonyos
Korábban volt egy feladat fennállásának igazolására bizonyos tulajdonságait ezt az objektumot. Aztán beszélt a DataSource tulajdonság. A meghatározott feladatok TypInfo.pas modul, akkor írj egy funkciót annak ellenőrzésére, hogy az ellenőrző Predna jelent dolgozik adatok:
funkció IsDataAware (AComponent: TComponent): Boole;
// keresése tulajdonság nevű adatforrás
PropInfo: = GetPropInfo (AComponent.ClassInfo, 'adatforrás');
Eredmény: = PropInfo <> semmi;
// Ellenőrizze, hogy megbizonyosodjon arról
// az eredete az osztály TDataSource.if Eredmény majd
ha nem ((PropInfo ^ .Proptype ^ .Kind = tkClass) és (GetTypeData (
Ez használ GetPropInfo () függvény pointer TPro- pInfo ezen az oldalon. Ez a függvény értéke nulla, ha az ingatlan nem létezik. További ellenőrzés szükséges annak biztosítása, hogy az adatforrás ingatlan valóban származik TDataSource osztályban.
Meg lehet javítani ezt a funkciót úgy, hogy ellenőrzi az Ön
CTBA az adott név:
funkció HasProperty (AComponent: TComponent; APropertyName: String): Boole;
PropInfo: = GetPropInfo (AComponent.ClassInfo, APropertyName);
Eredmény: = PropInfo <> semmi;
Megjegyzendő, hogy ez a megközelítés csak azokra tulajdonságokat bejelentett közzé. Mert nem közölt tulajdonságok RTTI adat hiányzik.