Obținerea de informații despre tipurile de RTTI
RegisterClasses ([TButton, TForm, TListBox, TPaintBox, TFindDialog, TOpenDialog, TTimer, TComponent, TGraphicControl]);
Un exemplu care ilustrează utilizarea RTTI pentru CLX, este atașat pe CD
CLX în directorul pentru acest capitol.
În această formă principală conține trei liste. Lista LbSampClasses conține numele mai multor clase de obiecte, informații despre tipul pe care doriți CHIT podea. La selectarea unui obiect din lista din lista lbSampClasses lbBaseClassInfo de informații de bază purtat cu privire la dimensiunea și originea obiectului, și în lista de lbPropList - informații despre proprietățile informațiilor obekta.Dlya selectat despre clasa utilizează trei scurgere auxiliar
• GetBaseClassInfo () - umple o listă de informații de bază despre obiecte
cele - tipul, dimensiunea, modulul în care este definit, și numărul de proprietăți.
• GetClassAncestry () - umple o listă de nume de obiecte de strămoși.
• GetClassProperties () - umple o listă a proprietăților din această clasă și tipurile lor.
Fiecare procedură este utilizată ca parametru de o instanță de obiect și o listă de șiruri.
Când utilizatorul selectează una dintre clase în lista lbSampClasses evenimentele sale de prelucrare de evacuare ra OnClick (lbSampClassesClick ()) determină funcția CreateAClass auxiliară (), care creează o instanță a tipului de clasă de numele clasei dat. Apoi, instanța obiect este transferat la destinație, la un suc de somn dorit a fost introdusă valoarea proprietăților TListBox.Items corespunzătoare.
Funcția CreateAClass () poate crea o clasă de numele său. Dar, așa cum a fost SKA Zano trecut la această funcție ca o clasă parametru trebuie să fie înregistrate folosind RegisterClasses procedură ().
Obținerea de informații despre tipurile de obiecte
GetBaseClassInfo () Procedura transmite valoarea returnată TOb- ject.ClassInfo () funcția, GetTypeData () definite în modulul TypeInfo.pas. Această procedură returnează un pointer la structura TTypeData construit pentru o clasă a cărei structură a fost atribuită PTypeInfo această procedură (vezi. Exemplul 10-2). Despre procedura este GetBaseClassInfo () doar indică diverse domenii și structuri AStrings TTypeInfo TTypeData pentru a extinde lista. Notă utilizarea funcției GetEnumName () pentru a crea un șir de caractere numit un tip enumerat. Aceasta este aceeași funcție RTTI definită în fișierul TypInfo.pas. Despre RTTI enumerate tipurile descrise în secțiunea următoare.
Utilizați funcția GetTypeData () este definit în fișierul TypInfo.pas pentru a obține un pointer la o structură TTypeInfo această clasă. Rezultat TObject.ClassInfo () funcția de apel ar trebui să fie transferate GetTypeData () funcția. BOARD
Pentru a obține numele de tip enumerat, reprezentat ca un șir de caractere, putem folosi funcția GetEnumName (). GetEnumValue () întoarce valoarea unui tip enumerat pentru un anumit nume.
Obținerea de informații cu privire la originea obiectului
Procedura GetClassAncestry () completează lista rânduri numele claselor de bază ale obiectului. Aceasta este o operație destul de simplă, folosind procedura chim ClassPar- () a obiectului și returnează un pointer la tipul clasei de baza TClass sau zero, dacă ajungeți în vârful ierarhiei moștenire (clasa bunic). GetClassAncestry Procedură () „ruleaza“ în întreaga ierarhie de moștenire și adaugă numele clasei de baza (strămoșii) în lista rândurile corespunzătoare.
Obținerea de informații despre tipurile de proprietăți obiect
Dacă obiectul are proprietăți care îi corespunde o valoare TTypeData.PropCount totală a acestora. Există mai multe abordări pentru a obține informații despre proprietățile acestei clase, dar există doar două dintre ele.
Procedura GetClassProperties () începe în același mod ca și ultimele două UI Toda, - cu o funcție GetTypeData () de transmitere a rezultatului funcției ClassInfo () pentru a obține pointerul la structura de clasă TTypeData. Apoi, pe baza valorii ClassTypeData.PropCount, memoria este alocată pentru variabilă proplist, lennoy definit ca un pointer la o matrice PPropList, care, la rândul său, este definit în modulul TypeInfo.pas:
TPropList = array [0..16379] de PPropInfo;
TPropList magazine matrice indicii pentru date TPropInfo fiecare proprietate. tip
TypeInfo.pas TPropInfo definită în modulul după cum urmează:
PPropInfo = ^ TPropInfo; TPropInfo = înregistrare ambalate
PropType: PPTypeInfo; GetProc: Pointer; SetProc: Pointer; StoredProc: Pointer; Index: Integer; Implicit: Longint; NameIndex: smallint; Nume: ShortString;
câmp TPropInfo este informații despre tipul de proprietate.
GetClassProperties () Procedura utilizează GetPropInfos () funcție
umple un pointer matrice informații RTTI despre toate proprietățile
obiect. Apoi, într-o buclă trece prin toate elementele de matrice, citește numele și tipurile de proprietăți ale datelor RTTI respective. Notă următoarea linie:
dacă nu (PropList [i] ^. ^ PropType .Kind = tkMethod) atunci
Utilizați funcția GetPropInfos (), dacă doriți să obțineți un pointer la infor- RTTI toate proprietățile obiectului. Pentru informații despre Insulele Proprietățile unui anumit tip, folosiți funcția GetPropList ().
Fig. 10.3 prezintă forma principală cu informații privind tipurile de rulare.
Fig. Formularul 10.3.Glavnaya cu informații despre tipurile de
Verificarea că proprietățile obiectului anumitor
Anterior, a existat o sarcină să verifice dacă există anumite proprietăți ale acestui obiect. Apoi au vorbit despre DataSource. Utilizarea funcțiilor definite în modulul TypInfo.pas, puteți scrie o funcție pentru a verifica dacă controlul Predná medie pentru lucrul cu date:
Funcția IsDataAware (AComponent: TComponent): Boolean;
// Căutați o proprietate numita DataSource
PropInfo: = GetPropInfo (AComponent.ClassInfo, 'DataSource');
Rezultat: = PropInfo <> nil;
// Verificați de două ori pentru a vă asigura
// originea clasei TDataSource.if Rezultatul atunci
dacă nu ((PropInfo ^ .Proptype ^ .Kind = tkClass) și (GetTypeData (
Acesta utilizează GetPropInfo () returnează un pointer TPro- pInfo pe această proprietate. Această funcție returnează o valoare de zero, în cazul în care proprietatea nu există. Pentru verificare suplimentară este necesară pentru a se asigura că DataSource într-adevăr vine din clasa TDataSource.
Acesta poate fi îmbunătățită această funcție, astfel încât verifică dvs.
CTBA cu orice nume dat:
Funcția HasProperty (AComponent: TComponent; APropertyName: String): Boolean;
PropInfo: = GetPropInfo (AComponent.ClassInfo, APropertyName);
Rezultat: = PropInfo <> nil;
Rețineți că această abordare este aplicabilă numai acelor proprietăți care sunt declarate ca publicate. Pentru proprietățile nepublicate date RTTI lipsesc.