Главная » Delphi » Модуль TypInfo.pas — определитель  RTTI

0

Информация о типе  существует  для  любого  объекта (потомка класса  TObject). Она  содержится в памяти и при  необходимости считывается интегрированной  сре дой  разработки  или  динамической библиотекой (runtime  library).   В  модуле  Typ-

Некоторые методы  класса  TObject, описанные в главе  2, “Язык  программирования

Object  Pascal”, перечислены в табл. 10.6.

Таблица 10.6. Методы класса TObject

Функция

Возвращаемый тип

Что возвращается

ClassName()

String

Имя класса объекта

ClassType()

TClass

Тип объекта

InheritsFrom()

Boolean

Логический индикатор, определяющий, происходит ли класс от другого заданного класса

ClassParent()

TClass

Тип базового класса объекта

InstanceSize()

Word

Размер  экземпляра объекта в байтах

ClassInfo()

Pointer

Указатель   на    находящуюся    в    памяти информацию (RTTI) об объекте

Теперь  пришло  время  подробно  остановиться  на  функции  ClassInfo(),  опреде

ляемой следующим образом:

class function ClassInfo: Pointer;

Данная функция возвращает указатель  на информацию RTTI для вызывающего класса,   а  именно —   на  структуру  типа   PTypeInfo.  Этот   тип   определен  в  модуле TypeInfo.pas как указатель  на структуру TTypeInfo. Оба определения приведены в следующем фрагменте TypeInfo.pas:

PPTypeInfo = ^PTypeInfo; PTypeInfo = ^TTypeInfo; TTypeInfo = record

Kind: TTypeKind; Name: ShortString;

{TypeData: TTypeData}

end;

Закомментированное поле TypeData содержит информацию о типе  данного клас са. Тип  этой  информации зависит от значения поля  Kind. Такое  поле  может  прини мать одно из значений перечисления TTypeKind:

TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface);

Вновь  обратимся к коду модуля TypeInfo.pas и ознакомимся с подтипами неко торых перечисленных выше  значений. Например, tkFloat может  содержать такие подтипы:

TFloatType = (ftSingle, ftDouble, ftExtended, ftComp, ftCurr);Таким  образом, по значению поля  Kind можно  определить, к какому  типу  отно сится   переменная  TypeData.  Определение  структура   TTypeData в  модуле TypeInfo.pas приведено в листинге 10.2.

Листинг 10.2. Структура TTypeData

PTypeData = ^TTypeData; TTypeData = packed record

case TTypeKind of

tkUnknown, tkLString, tkWString, tkVariant: ();

tkInteger, tkChar, tkEnumeration, tkSet, tkWChar: (

OrdType: TOrdType;

case TTypeKind of

tkInteger, tkChar, tkEnumeration, tkWChar: (

MinValue: Longint;

MaxValue: Longint;

case TTypeKind of

tkInteger, tkChar, tkWChar: ();

tkEnumeration: (

BaseType: PPTypeInfo;

NameList: ShortStringBase));

tkSet: (

CompType: PPTypeInfo));

tkFloat: (FloatType: TFloatType);

tkString: (MaxLength: Byte);

tkClass: (

ClassType: TClass;

ParentInfo: PPTypeInfo;

PropCount: SmallInt;

UnitName: ShortStringBase;

{PropData: TPropData});

tkMethod: (

MethodKind: TMethodKind;

ParamCount: Byte;

ParamList: array[0..1023] of Char

{ParamList: array[1..ParamCount] of

record

Flags: TParamFlags;

ParamName: ShortString;

TypeName: ShortString;

end;

ResultType: ShortString});

tkInterface: (

IntfParent : PPTypeInfo; { ancestor }

IntfFlags : TIntfFlagsBase;

Guid : TGUID;

IntfUnit : ShortStringBase;

{PropData: TPropData});

tkInt64: (

MinInt64Value, MaxInt64Value: Int64);

end;Как видите, структура  TTypeData представляет собой  большую запись  с варианта ми. Для тех, кто знаком  с подобными записями и указателями, нетрудно разобраться и с принципами RTTI.  Они  кажутся  сложными только  из за того,  что  технология RTTI не документирована.

НА ЗАМЕТКУ

Иногда Borland не документирует свои технологии, так как они подлежат изменению в следующей версии продукта. При использовании таких возможностей (например недо- кументированной технологии RTTI) может оказаться, что созданный код будет не впол- не совместим с будущими версиями Delphi.

Теперь продемонстрируем использование структур RTTI для получения информа

ции о типах.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии