Типы времени выполнения (RTTI)
Информация о типе во время выполнения (Runtime Type Information, RTTI) - это способность среды Delphi предоставлять приложению информацию об объектах во время выполнения приложения. Так как все объекты Delphi являются потомками класса TObject, то все они содержат указатель на информацию о типе, а также методы для работы с этой информацией. В приведенной ниже табл. 2.8 приведены некоторые из этих методов.
Таблица 2.8. Методы для работы с RTTI
|
|
|
|
|
|
Название метода
|
Тип возвращаемого результата
|
Результат
|
|
|
Classlnfo
|
Pointer
|
Указатель на информацию о типе объекта
|
|
|
ClassName
|
String
|
Имя класса объекта
|
|
|
ClassParent
|
Tclass
|
Тип класса-предка объекта
|
|
|
ClassType
|
Tclass
|
Тип объекта
|
|
|
InheritsFrom
|
Boolean
|
Является ли объект потомком данного класса
|
|
|
InstanceSize
|
Word
|
Размер объекта, как экземпляра класса, в байтах
|
|
|
|
|
|
|
Для работы с информацией о типе времени исполнения в Delphi имеется два основных оператора: is и as. Первый применяется для сравнения типов, второй - для преобразования типов времени выполнения.
Информация о типе времени выполнения используется в Delphi в основном для определения, с объектом какого типа работает сейчас приложение. Рассмотрим пример использования информации RTTI. Разместим на новой форме несколько различных компонентов. Предположим, что в какой-то момент во время работы приложения нам необходимо отключить все кнопки, расположенные на форме. Для реализации этого можно пройтись по всем компонентам формы, узнать их тип, и если это тип TButton, то задать свойству Enabled данного компонента значение false. Код для этого примера приведен на листинге 2.5.
Листинг 2.5
for i:=0 to ComponentCount-1 do
if Components[i] is TButton then
TButton(Components[i]).Enabled:=false;
В данном примере мы используем оператор is для определения типа компонента. Теперь рассмотрим пример использования оператора as. Код, представленный на листинге 2.6, отключает все компоненты, которые произошли от одного предка TControi.
Листинг 2.6
for i:=0 to ComponentCount-1 do
(Sender as TControi).Enabled:=false;
Глава 5 Содержание Глава 7
Содержание раздела