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.

Első információk a fajta RTTI

Á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.