Получаване на информация за видовете RTTI

RegisterClasses ([TButton, TForm, TListBox, TPaintBox, TFindDialog, TOpenDialog, TTimer, TComponent, TGraphicControl]);

Един пример, илюстриращ използването RTTI за CLX, е приложен на CD

CLX в указателя за тази глава.

В тази основна форма съдържа три списъци. LbSampClasses списък съдържа имената на няколко класа обекти, информация за вида, който искате етаж бележчица на. При избора на обект от списъка в lbSampClasses lbBaseClassInfo списък на износени основна информация за размера и произхода на обекта, и по lbPropList списък - информация за свойствата на избрания obekta.Dlya информация за класа използва три спомагателни изтичане

• GetBaseClassInfo () - попълва списък с основна информация за обектите

тези - вида, размера на модула, в която тя се определя, както и броя на свойства.

• GetClassAncestry () - попълва списък на обектите имена на предци.

• GetClassProperties () - попълва списък на свойствата на този клас и техните видове.

Всяка процедура се използва като параметър обект, например, както и списък на низове.

Когато потребителят избира един от класовете в списъка lbSampClasses събитията обработка изтичане RA OnClick (lbSampClassesClick ()) причинява функцията спомагателната CreateAClass (), който създава например от типа клас на дадено името на класа. След това инстанция на обекта се прехвърля към местоназначението, до желаната сок сън е въведена стойност на съответните свойства TListBox.Items.

CreateAClass () функция може да се създаде клас от името му. Но, както е било SKA Zano предава на тази функция като клас параметър трябва да се регистрира с помощта на RegisterClasses () процедура.

Получаване на информация за видовете обекти

GetBaseClassInfo () процедура предава стойността на връщане TOb- ject.ClassInfo () функция, GetTypeData () е определено в TypeInfo.pas модул. Тази процедура се връща указател към TTypeData конструкция, изградена за клас, чиято структура е назначен PTypeInfo тази процедура (вж. Пример 10-2). За процедура е GetBaseClassInfo () просто насочва към различни области и структури TTypeInfo TTypeData AStrings да разшири списъка. Обърнете внимание на използването на функцията GetEnumName (), за да създадете низ нарича номерираните тип. Това е една и съща функция RTTI е определено в TypInfo.pas файл. За RTTI изброени видове, описани в следващия раздел.

Използвайте функцията GetTypeData () е определено в TypInfo.pas файл, за да се получи указател към структура TTypeInfo този клас. Резултат TObject.ClassInfo () извикване на функция следва да бъдат прехвърлени GetTypeData () функция. BOARD

За да получите името на номерираните вида, представен като низ, можем да използваме функция GetEnumName (). GetEnumValue () връща стойността на номерираните вид за дадена име.

Получаване на информация за произхода на обекта

GetClassAncestry () процедура попълва списъка редове имена на базовите класове на обекта. Това е доста проста работа, като се използва процедура ClassPar- вх () на обекта и връща указател към тип базов клас Чклас или нулева за това, ако стигнете до върха на йерархията на наследяване (развъждане клас). GetClassAncestry процедура () "работи" в цялата йерархия на наследяване и добавя имената на базовия клас (предците) за съответния списък редове.

Получаване на информация за вида на свойствата на обекти

Ако обектът притежава качества, които съответства на стойност TTypeData.PropCount общия им. Съществуват няколко подхода за събиране на информация за свойствата на този клас, но само две от тях.

GetClassProperties () процедура започва по същия начин, както и предходните два IU Тода - с функция за GetTypeData () на предаване на функция в резултат ClassInfo (), за да получите показалеца класовата структура TTypeData. След това въз основа на стойността ClassTypeData.PropCount, заделено за променливата на proplist, lennoy дефинира като указател към масив PPropList, което, от своя страна, се определя в TypeInfo.pas модул:

TPropList = масив [0..16379] на PPropInfo;

TPropList магазини масив указатели към данни TPropInfo всеки имот. тип

TPropInfo TypeInfo.pas дефинирани в модула, както следва:

PPropInfo = ^ TPropInfo; TPropInfo = опаковани рекорд

PropType: PPTypeInfo; GetProc: Pointer; SetProc: Pointer; StoredProc: Pointer; Индекс: Integer; По подразбиране: Longint; NameIndex: SMALLINT; Име: ShortString;

поле TPropInfo е информация за вида на собственост.

GetClassProperties () процедура използва GetPropInfos () функция

запълнят указатели масиви RTTI информация за всички свойства на

обект. След това, в една линия минава през всички елементи на масива, чете имената и типовете на свойствата на съответния данни RTTI. Обърнете внимание на следния ред:

ако не (PropList [Ь] ^. ^ PropType .Kind = tkMethod) след това

Използвайте функцията GetPropInfos (), ако искате да получите указател към пре- доставената информация, RTTI всички свойства на обекта. За информация относно острови Свойствата на определен тип, използвайте функцията GetPropList ().

Фиг. 10.3 показва основната форма с информация от вида на изпълнение.

Получаване на информация за видовете RTTI

Фиг. 10.3.Glavnaya форма с информация за видовете

Проверка че предметът свойства на някои

Преди това имаше задача да провери наличието на определени свойства на този обект. След това те говорят за източника на данни имота. Използване на функциите, определени в TypInfo.pas модул, можете да напишете функция, за да се провери дали контролът Predna означава за работа с данни:

функция IsDataAware (AComponent: TComponent): булева;

// Търсене на имот, наречен DataSource на

PropInfo: = GetPropInfo (AComponent.ClassInfo "DataSource ');

Резултат: = PropInfo <> нула;

// Двойна проверка, за да се уверите,

// произхода на резултата от клас TDataSource.if след това

ако не ((PropInfo ^ .Proptype ^ .Kind = tkClass) и (GetTypeData (

Той използва GetPropInfo () връща указател TPro- pInfo на този имот. Функцията връща стойност от нула, ако имотът не съществува. За допълнителна проверка е необходимо да се гарантира, че DataSource имота наистина идва от TDataSource клас.

Тя може да се подобри тази функция, така че тя проверява за вашия

CTBA с който и да е име:

функция HasProperty (AComponent: TComponent; APropertyName: String): булева;

PropInfo: = GetPropInfo (AComponent.ClassInfo, APropertyName);

Резултат: = PropInfo <> нула;

Имайте предвид, че този подход е приложим само за тези имоти, които са декларирани като публикува. За непубликувани свойства RTTI липсват данни.